/ Hex Artifact Content
Login

Artifact 6ea37de364f483496f60e47c996b429a9f313d54:


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 30 39 20 32 30 30 38 2f 30  c,v 1.509 2008/0
0190: 39 2f 30 35 20 30 35 3a 30 32 3a 34 37 20 64 61  9/05 05:02:47 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 70  OK && 0==pCur->p
2210: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20  Page->intKey){. 
2220: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
2230: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70 43  sqlite3Malloc(pC
2240: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ur->nKey);.    i
2250: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
2260: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2270: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70  eeKey(pCur, 0, p
2280: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
2290: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22b0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
22c0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
22d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
22e0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
22f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2300: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2310: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2320: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
2330: 20 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69   !pCur->pPage->i
2340: 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e  ntKey || !pCur->
2350: 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72  pKey );..  if( r
2360: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2370: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2380: 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
2390: 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
23a0: 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  0;.    pCur->eSt
23b0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
23c0: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
23d0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
23e0: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
23f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2400: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
2410: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
2420: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70  cursors except p
2430: 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74  Except open on t
2440: 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74  he table .** wit
2450: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
2460: 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  t. Usually, this
2470: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
2480: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a  before cursor.**
2490: 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64   pExcept is used
24a0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74   to modify the t
24b0: 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74  able (BtreeDelet
24c0: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
24d0: 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rt())..*/.static
24e0: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
24f0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
2500: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
2510: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
2520: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2530: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2540: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2550: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2560: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
2570: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
2580: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
2590: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
25a0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
25b0: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
25c0: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
25d0: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
25e0: 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20  =iRoot) && .    
25f0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43      p->eState==C
2600: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2610: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
2620: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
2630: 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  (p);.      if( S
2640: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
2650: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2660: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
2670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2680: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2690: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
26a0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
26b0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
26c0: 6f 69 64 20 63 6c 65 61 72 43 75 72 73 6f 72 50  oid clearCursorP
26d0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
26e0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
26f0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2700: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
2710: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
2720: 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  ->pKey);.  pCur-
2730: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75  >pKey = 0;.  pCu
2740: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2750: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  OR_INVALID;.}../
2760: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
2770: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
2780: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
2790: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
27a0: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
27b0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
27c0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
27d0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
27e0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
27f0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
2800: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
2810: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
2820: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
2830: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
2840: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
2850: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
2860: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2870: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
2880: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
2890: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e  osition()..*/.in
28a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65  t sqlite3BtreeRe
28b0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
28c0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
28d0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
28e0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
28f0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2900: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2910: 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
2920: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2930: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2940: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2950: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2960: 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2970: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2980: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2990: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
29a0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
29b0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
29c0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75  r->nKey, 0, &pCu
29d0: 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20  r->skip);.  if( 
29e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2a00: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
2a10: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
2a20: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
2a30: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a40: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
2a50: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2a60: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d  R_INVALID );.  }
2a70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a80: 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65  .#define restore
2a90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2aa0: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
2ab0: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
2ac0: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
2ad0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65    sqlite3BtreeRe
2ae0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2af0: 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20  ion(p) : \.     
2b00: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a      SQLITE_OK)..
2b10: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2b20: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2b30: 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65   cursor has move
2b40: 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74  d from the posit
2b50: 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ion it.** was la
2b60: 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43  st placed at.  C
2b70: 75 72 73 6f 72 20 63 61 6e 20 6d 6f 76 65 20 77  ursor can move w
2b80: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
2b90: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   are pointing.**
2ba0: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
2bb0: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
2bc0: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  em..**.** This r
2bd0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
2be0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
2bf0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
2c00: 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  rong.  The.** in
2c10: 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64  teger *pHasMoved
2c20: 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69   is set to one i
2c30: 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
2c40: 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20   moved and 0 if 
2c50: 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
2c60: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
2c70: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
2c80: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
2c90: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2ca0: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  ;..  rc = restor
2cb0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2cc0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
2cd0: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
2ce0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
2cf0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
2d00: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2d10: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2d20: 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20  ur->skip!=0 ){. 
2d30: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
2d40: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2d50: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a  *pHasMoved = 0;.
2d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2d70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
2d80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2d90: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
2da0: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
2db0: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
2dc0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
2dd0: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
2de0: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
2df0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
2e00: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
2e10: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
2e20: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
2e30: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
2e40: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
2e50: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
2e60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
2e70: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
2e80: 61 70 50 61 67 65 2c 20 69 50 74 72 4d 61 70 2c  apPage, iPtrMap,
2e90: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
2ea0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2eb0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2ec0: 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70  ;.  nPagesPerMap
2ed0: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
2ee0: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
2ef0: 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d  iPtrMap = (pgno-
2f00: 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50  2)/nPagesPerMapP
2f10: 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50  age;.  ret = (iP
2f20: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
2f30: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
2f40: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
2f50: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2f60: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
2f70: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
2f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
2f90: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
2fa0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
2fb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2fc0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
2fd0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
2fe0: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
2ff0: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
3000: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
3010: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
3020: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
3030: 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72  pgno'..** An err
3040: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3050: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
3060: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
3070: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
3080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3090: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
30a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
30b0: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
30c0: 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50  o parent){.  DbP
30d0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
30e0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
30f0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
3100: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
3110: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
3120: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
3130: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
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 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
3160: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
3170: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
3180: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3190: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
31a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
31c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
31d0: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
31e0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d  al page number m
31f0: 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65  ust never be use
3200: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d  d as a pointer m
3210: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73  ap page */.  ass
3220: 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49  ert( 0==PTRMAP_I
3230: 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49  SPAGE(pBt, PENDI
3240: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
3250: 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  )) );..  assert(
3260: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
3270: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
3280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
3290: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
32a0: 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  PT;.  }.  iPtrma
32b0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
32c0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
32d0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32e0: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
32f0: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
3300: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
3310: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3320: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
3330: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
3340: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
3350: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74 72  ap, key);.  pPtr
3360: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
3370: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
3380: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
3390: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
33a0: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
33b0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
33c0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
33d0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
33e0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
33f0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
3400: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
3410: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ));.    rc = sql
3420: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
3430: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
3440: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3450: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
3460: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
3470: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
3480: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
3490: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
34a0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
34b0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
34c0: 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
34d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
34e0: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
34f0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
3500: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3510: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
3520: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
3530: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
3540: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
3550: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
3560: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
3570: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
3580: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
3590: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
35a0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
35b0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
35c0: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
35d0: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
35e0: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
35f0: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
3600: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
3610: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
3620: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
3630: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
3640: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
3650: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
3660: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
3670: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
3680: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
3690: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
36a0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
36b0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
36c0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
36d0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
36e0: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
36f0: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
3700: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3710: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3720: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
3730: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
3740: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
3750: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3760: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
3770: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
3780: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
3790: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
37a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
37b0: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
37c0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
37d0: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
37e0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
37f0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
3800: 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  , key);.  assert
3810: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
3820: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
3830: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
3840: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
3850: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
3860: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
3870: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
3880: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
3890: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
38a0: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
38b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
38c0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
38d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
38e0: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
38f0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
3900: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
3910: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
3920: 50 75 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Put(w,x,y,z) SQL
3930: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
3940: 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79   ptrmapGet(w,x,y
3950: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
3960: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
3970: 74 4f 76 66 6c 28 79 2c 7a 29 20 53 51 4c 49 54  tOvfl(y,z) SQLIT
3980: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
3990: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
39a0: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
39b0: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
39c0: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
39d0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
39e0: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
39f0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
3a00: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
3a10: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
3a20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
3a30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3a40: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
3a50: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
3a60: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
3a70: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
3a80: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
3a90: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
3aa0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
3ab0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28  Page & get2byte(
3ac0: 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d  &(P)->aData[(P)-
3ad0: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49  >cellOffset+2*(I
3ae0: 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  )])))../*.** Thi
3af0: 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  s a more complex
3b00: 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64   version of find
3b10: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
3b20: 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74  s for.** pages t
3b30: 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f  hat do contain o
3b40: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20  verflow cells.  
3b50: 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74  See insert.*/.st
3b60: 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65  atic u8 *findOve
3b70: 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67  rflowCell(MemPag
3b80: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
3b90: 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ell){.  int i;. 
3ba0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3bb0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
3bc0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
3bd0: 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d  ;.  for(i=pPage-
3be0: 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e  >nOverflow-1; i>
3bf0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; i--){.    in
3c00: 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t k;.    struct 
3c10: 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c  _OvflCell *pOvfl
3c20: 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70  ;.    pOvfl = &p
3c30: 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a  Page->aOvfl[i];.
3c40: 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69      k = pOvfl->i
3c50: 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69  dx;.    if( k<=i
3c60: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
3c70: 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k==iCell ){.  
3c80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76        return pOv
3c90: 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20  fl->pCell;.     
3ca0: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
3cb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3cc0: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
3cd0: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
3ce0: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
3cf0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
3d00: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
3d10: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
3d20: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
3d30: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
3d40: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
3d50: 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
3d60: 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73  arseCell() takes
3d70: 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65   a .** cell inde
3d80: 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  x as the second 
3d90: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c  argument and sql
3da0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3db0: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
3dc0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
3dd0: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
3de0: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
3df0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
3e00: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
3e10: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
3e20: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
3e30: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
3e40: 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  of.** sqlite3Btr
3e50: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
3e60: 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d  . Using some com
3e70: 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c  pilers, this wil
3e80: 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a  l be faster..*/.
3e90: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
3ea0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
3eb0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
3ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3ed0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
3ee0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
3ef0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
3f00: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3f10: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
3f20: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
3f30: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
3f40: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
3f50: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cture */.){.  in
3f60: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
3f70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3f80: 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f  bytes in cell co
3f90: 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a  ntent header */.
3fa0: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
3fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3fc0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
3fd0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
3fe0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3ff0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
4000: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
4010: 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43   );..  pInfo->pC
4020: 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61  ell = pCell;.  a
4030: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
4040: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
4050: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d  leaf==1 );.  n =
4060: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
4070: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
4080: 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65  n==4-4*pPage->le
4090: 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  af );.  if( pPag
40a0: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
40b0: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
40c0: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ata ){.      n +
40d0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
40e0: 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61  Cell[n], nPayloa
40f0: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
4100: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
4110: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b  0;.    }.    n +
4120: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  = getVarint(&pCe
4130: 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[n], (u64*)&pI
4140: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  nfo->nKey);.    
4150: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e  pInfo->nData = n
4160: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
4170: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  {.    pInfo->nDa
4180: 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d  ta = 0;.    n +=
4190: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
41a0: 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64  ell[n], nPayload
41b0: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
41c0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
41d0: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
41e0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
41f0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65  .  pInfo->nHeade
4200: 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6c 69 6b  r = n;.  if( lik
4210: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
4220: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
4230: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
4240: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
4250: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
4260: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
4270: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
4280: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
4290: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
42a0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
42b0: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
42c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
42d0: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
42e0: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
42f0: 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e  */.    nSize = n
4300: 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20  Payload + n;.   
4310: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
4320: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70   nPayload;.    p
4330: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4340: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53  = 0;.    if( (nS
4350: 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a  ize & ~3)==0 ){.
4360: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b        nSize = 4;
4370: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
4380: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
4390: 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70  4 */.    }.    p
43a0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53  Info->nSize = nS
43b0: 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
43c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
43d0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
43e0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
43f0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
4400: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
4410: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
4420: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
4430: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
4440: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
4450: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
4460: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
4470: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
4480: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
4490: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
44a0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
44b0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
44c0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
44d0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
44e0: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
44f0: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
4500: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
4510: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
4520: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
4530: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
4540: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
4550: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
4560: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
4570: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
4580: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
4590: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
45a0: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
45b0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
45c0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
45d0: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
45e0: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
45f0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
4600: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
4610: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
4620: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
4630: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
4640: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
4650: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
4660: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
4670: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
4680: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
4690: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
46a0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
46b0: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
46c0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
46d0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
46e0: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66  ize - 4);.    if
46f0: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
4700: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
4710: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73  Info->nLocal = s
4720: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
4730: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
4740: 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61  nLocal = minLoca
4750: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
4760: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
4770: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
4780: 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  n;.    pInfo->nS
4790: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
47a0: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
47b0: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
47c0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
47d0: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c  , pInfo) \.  sql
47e0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
47f0: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
4800: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
4810: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
4820: 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  o)).void sqlite3
4830: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  BtreeParseCell(.
4840: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
4850: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
4860: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
4870: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
4880: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
4890: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
48a0: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
48b0: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
48c0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
48d0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
48e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
48f0: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
4900: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
4910: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
4920: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
4930: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4940: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
4950: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
4960: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
4970: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
4980: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
4990: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
49a0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
49b0: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
49c0: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
49d0: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
49e0: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
49f0: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
4a00: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
4a10: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
4a20: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
4a30: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
4a40: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
4a50: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4a60: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4a70: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
4a80: 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  iCell, &info);. 
4a90: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
4aa0: 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61  ze;.}.#endif.sta
4ab0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
4ac0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
4ad0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
4ae0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4af0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4b00: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4b10: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4b20: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
4b30: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  nSize;.}..#ifnde
4b40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4b50: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
4b60: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
4b70: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
4b80: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
4b90: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
4ba0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
4bb0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
4bc0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
4bd0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
4be0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
4bf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4c00: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
4c10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
4c20: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
4c30: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73  Info info;.  ass
4c40: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
4c50: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4c60: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
4c70: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
4c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
4c90: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4ca0: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4cb0: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
4cc0: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e  oad );.  if( (in
4cd0: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
4ce0: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
4cf0: 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
4d00: 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  l ){.    Pgno ov
4d10: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
4d20: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
4d30: 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  low]);.    retur
4d40: 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  n ptrmapPut(pPag
4d50: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
4d60: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
4d70: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
4d80: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4d90: 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66  E_OK;.}./*.** If
4da0: 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69   the cell with i
4db0: 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61  ndex iCell on pa
4dc0: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
4dd0: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
4de0: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
4df0: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
4e00: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
4e10: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
4e20: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
4e30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4e40: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d   ptrmapPutOvfl(M
4e50: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
4e60: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20  nt iCell){.  u8 
4e70: 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pCell;.  assert
4e80: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4e90: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
4ea0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65  >mutex) );.  pCe
4eb0: 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  ll = findOverflo
4ec0: 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  wCell(pPage, iCe
4ed0: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74  ll);.  return pt
4ee0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
4ef0: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a  Page, pCell);.}.
4f00: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
4f10: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
4f20: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
4f30: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
4f40: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
4f50: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
4f60: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
4f70: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
4f80: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
4f90: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
4fa0: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
4fb0: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
4fc0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
4fd0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
4fe0: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
4ff0: 63 20 76 6f 69 64 20 64 65 66 72 61 67 6d 65 6e  c void defragmen
5000: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
5010: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
5040: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5070: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
5080: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50a0: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
50b0: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
50c0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
50d0: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
50f0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
5100: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
5110: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
5120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5130: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
5140: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
5150: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5160: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
5170: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
5180: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
5190: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
51a0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
51b0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
51c0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
51d0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
51e0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
51f0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
5200: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
5210: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
5220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5230: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
5240: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
5250: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
5260: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
5270: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
5280: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
5290: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
52a0: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
52b0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
52c0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
52d0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
52e0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
52f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5300: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
5310: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
5320: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
5330: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
5340: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
5350: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
5360: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
5370: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5380: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5390: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
53a0: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
53b0: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
53c0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
53d0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
53e0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
53f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
5400: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
5410: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
5420: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
5430: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
5440: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
5450: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
5460: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
5470: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
5480: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62  usableSize;.  cb
5490: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
54a0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
54b0: 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b  emcpy(&temp[cbrk
54c0: 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ], &data[cbrk], 
54d0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72  usableSize - cbr
54e0: 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  k);.  cbrk = usa
54f0: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
5500: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
5510: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
5520: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
5530: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
5540: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
5550: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
5560: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
5570: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
5580: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3c  .    assert( pc<
5590: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
55a0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69  leSize );.    si
55b0: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
55c0: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
55d0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
55e0: 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79  size;.    memcpy
55f0: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74  (&data[cbrk], &t
5600: 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  emp[pc], size);.
5610: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
5620: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20  dr, cbrk);.  }. 
5630: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63   assert( cbrk>=c
5640: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
5650: 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l );.  put2byte(
5660: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
5670: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
5680: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
5690: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
56a0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
56b0: 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65  addr = cellOffse
56c0: 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d  t+2*nCell;.  mem
56d0: 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  set(&data[addr],
56e0: 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a   0, cbrk-addr);.
56f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
5700: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
5710: 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65   space on a page
5720: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
5730: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
5740: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20  age->aData[] of 
5750: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
5760: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c  f.** the new all
5770: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61  ocation.  The ca
5780: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
5790: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
57a0: 6f 75 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20  ough.** space.  
57b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
57c0: 6c 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a  l never fail..**
57d0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
57e0: 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20  contains nBytes 
57f0: 6f 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75  of free space bu
5800: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
5810: 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20  in.** nBytes of 
5820: 63 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20  contiguous free 
5830: 73 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73  space, then this
5840: 20 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74   routine automat
5850: 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20  ically.** calls 
5860: 64 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28  defragementPage(
5870: 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65  ) to consolidate
5880: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
5890: 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63  before .** alloc
58a0: 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68  ating the new ch
58b0: 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  unk..*/.static i
58c0: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
58d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
58e0: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
58f0: 6e 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72  nt addr, pc, hdr
5900: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  ;.  int size;.  
5910: 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74  int nFrag;.  int
5920: 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c   top;.  int nCel
5930: 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  l;.  int cellOff
5940: 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  set;.  unsigned 
5950: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20  char *data;.  . 
5960: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
5970: 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20  Data;.  assert( 
5980: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5990: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
59a0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
59b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
59c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
59d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
59e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
59f0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5a00: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
5a10: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
5a20: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
5a30: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
5a40: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
5a50: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
5a60: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50  rflow==0 );.  pP
5a70: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42  age->nFree -= nB
5a80: 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  yte;.  hdr = pPa
5a90: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a  ge->hdrOffset;..
5aa0: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
5ab0: 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72  dr+7];.  if( nFr
5ac0: 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ag<60 ){.    /* 
5ad0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
5ae0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
5af0: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
5b00: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
5b10: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65  .    ** space re
5b20: 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64  quest. */.    ad
5b30: 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20  dr = hdr+1;.    
5b40: 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74  while( (pc = get
5b50: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
5b60: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ]))>0 ){.      s
5b70: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
5b80: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
5b90: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
5ba0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
5bb0: 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29  ( size<nByte+4 )
5bc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
5bd0: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
5be0: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
5bf0: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
5c00: 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73  r+7] = nFrag + s
5c10: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
5c20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5c30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5c40: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
5c50: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
5c60: 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20   size-nByte);.  
5c70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
5c80: 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  c + size - nByte
5c90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5ca0: 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d    }.      addr =
5cb0: 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   pc;.    }.  }..
5cc0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
5cd0: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
5ce0: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
5cf0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
5d00: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
5d10: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
5d20: 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d  ea..  */.  top =
5d30: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5d40: 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c  hdr+5]);.  nCell
5d50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5d60: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c  a[hdr+3]);.  cel
5d70: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5d80: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69  >cellOffset;.  i
5d90: 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20  f( nFrag>=60 || 
5da0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
5db0: 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79  Cell > top - nBy
5dc0: 74 65 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67  te ){.    defrag
5dd0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
5de0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
5df0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5e00: 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20  );.  }.  top -= 
5e10: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
5e20: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
5e30: 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a  nCell <= top );.
5e40: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5e50: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
5e60: 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a   return top;.}..
5e70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
5e80: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
5e90: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
5ea0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
5eb0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
5ec0: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
5ed0: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
5ee0: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
5ef0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
5f00: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
5f10: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
5f20: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
5f30: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
5f40: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
5f50: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
5f60: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
5f70: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
5f80: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
5f90: 76 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d  void freeSpace(M
5fa0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
5fb0: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
5fc0: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
5fd0: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
5fe0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
5ff0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
6000: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
6010: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
6020: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6030: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6040: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6050: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6060: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
6070: 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
6080: 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20  >leaf?0:4) );.  
6090: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
60a0: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
60b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
60c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
60d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
60e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
60f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
6100: 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d  ize>=0 );   /* M
6110: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
6120: 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66   is 4 */..#ifdef
6130: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
6140: 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77  ELETE.  /* Overw
6150: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
6160: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
6170: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43  ros when the SEC
6180: 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a  URE_DELETE .  **
6190: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
61a0: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
61b0: 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  me */.  memset(&
61c0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
61d0: 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  size);.#endif.. 
61e0: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
61f0: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
6200: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
6210: 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68  reeblocks */.  h
6220: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
6230: 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20  ffset;.  addr = 
6240: 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  hdr + 1;.  while
6250: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
6260: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
6270: 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67  ))<start && pbeg
6280: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  in>0 ){.    asse
6290: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
62a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
62b0: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  ze-4 );.    asse
62c0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
62d0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62  );.    addr = pb
62e0: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egin;.  }.  asse
62f0: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
6300: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6310: 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-4 );.  assert
6320: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c  ( pbegin>addr ||
6330: 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20   pbegin==0 );.  
6340: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  put2byte(&data[a
6350: 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20  ddr], start);.  
6360: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
6370: 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a  tart], pbegin);.
6380: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
6390: 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29  [start+2], size)
63a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
63b0: 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20   += size;..  /* 
63c0: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
63d0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
63e0: 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d  .  addr = pPage-
63f0: 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a  >hdrOffset + 1;.
6400: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
6410: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6420: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
6430: 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73     int pnext, ps
6440: 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
6450: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a   pbegin>addr );.
6460: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6470: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
6480: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
6490: 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32      pnext = get2
64a0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
64b0: 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d  n]);.    psize =
64c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
64d0: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
64e0: 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69  if( pbegin + psi
64f0: 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20  ze + 3 >= pnext 
6500: 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20  && pnext>0 ){.  
6510: 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70      int frag = p
6520: 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70  next - (pbegin+p
6530: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73  size);.      ass
6540: 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b  ert( frag<=data[
6550: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6560: 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74  +7] );.      dat
6570: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
6580: 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20  et+7] -= frag;. 
6590: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
65a0: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74  ata[pbegin], get
65b0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
65c0: 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32  t]));.      put2
65d0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
65e0: 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32  n+2], pnext+get2
65f0: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
6600: 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20  +2])-pbegin);.  
6610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6620: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
6630: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
6640: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6650: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
6660: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
6670: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
6680: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
6690: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
66a0: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
66b0: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
66c0: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
66d0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
66e0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
66f0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
6700: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
6710: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
6720: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
6730: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
6740: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
6750: 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74  dr+5], top + get
6760: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6770: 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  in+2]));.  }.}..
6780: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
6790: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
67a0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
67b0: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
67c0: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
67d0: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
67e0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
67f0: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
6800: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
6810: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
6820: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
6830: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
6840: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
6850: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
6860: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
6870: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
6880: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
6890: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
68a0: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
68b0: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
68c0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
68d0: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
68e0: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
68f0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
6900: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
6910: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
6920: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
6930: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
6940: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
6950: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
6960: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
6970: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
6980: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
6990: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
69a0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
69b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
69c0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
69d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
69e0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 66   pPage->leaf = f
69f0: 6c 61 67 42 79 74 65 3e 3e 33 3b 20 20 61 73 73  lagByte>>3;  ass
6a00: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
6a10: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
6a20: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
6a30: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
6a40: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
6a50: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74  age->leaf;.  pBt
6a60: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
6a70: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
6a80: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
6a90: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
6aa0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6ab0: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
6ac0: 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d  hasData = pPage-
6ad0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
6ae0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
6af0: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
6b00: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
6b10: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
6b20: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
6b30: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
6b40: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
6b50: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
6b60: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
6b70: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   0;.    pPage->m
6b80: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
6b90: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
6ba0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
6bb0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
6bc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6bd0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6be0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
6bf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6c00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
6c10: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
6c20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
6c30: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
6c40: 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
6c50: 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
6c60: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
6c70: 74 68 65 20 4d 65 6d 50 61 67 65 20 77 68 69 63  the MemPage whic
6c80: 68 0a 2a 2a 20 69 73 20 74 68 65 20 70 61 72 65  h.** is the pare
6c90: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 62  nt of the page b
6ca0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
6cb0: 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61  .  The root of a
6cc0: 0a 2a 2a 20 42 54 72 65 65 20 68 61 73 20 6e 6f  .** BTree has no
6cd0: 20 70 61 72 65 6e 74 20 61 6e 64 20 73 6f 20 66   parent and so f
6ce0: 6f 72 20 74 68 61 74 20 70 61 67 65 2c 20 70 50  or that page, pP
6cf0: 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a  arent==NULL..**.
6d00: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
6d10: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
6d20: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
6d30: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
6d40: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
6d50: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
6d60: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
6d70: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
6d80: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
6d90: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
6da0: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
6db0: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
6dc0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
6dd0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
6de0: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
6df0: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
6e00: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
6e10: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  rruption..*/.int
6e20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
6e30: 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  tPage(.  MemPage
6e40: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
6e50: 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
6e60: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
6e70: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
6e80: 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ent       /* The
6e90: 20 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20   parent.  Might 
6ea0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6eb0: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
6ec0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
6ed0: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
6ee0: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
6ef0: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  [] */.  int hdr;
6f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6f10: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
6f20: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
6f30: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
6f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
6f50: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
6f60: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
6f70: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
6f80: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
6f90: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
6fa0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
6fb0: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
6fc0: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
6fd0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ch page */.  int
6fe0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
6ff0: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
7000: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
7010: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
7020: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
7030: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
7040: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
7050: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
7060: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
7070: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
7080: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
7090: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
70a0: 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67  */..  pBt = pPag
70b0: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
70c0: 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ( pBt!=0 );.  as
70d0: 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30  sert( pParent==0
70e0: 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74   || pParent->pBt
70f0: 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ==pBt );.  asser
7100: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7110: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7120: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7130: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
7140: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
7150: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
7160: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
7170: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
7180: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
7190: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
71a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
71b0: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
71c0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
71d0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
71e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
71f0: 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20  Parent!=pParent 
7200: 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65  && (pPage->pPare
7210: 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  nt!=0 || pPage->
7220: 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f  isInit) ){.    /
7230: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67  * The parent pag
7240: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63  e should never c
7250: 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65  hange unless the
7260: 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
7270: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
7280: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7290: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  PT;.  }.  if( pP
72a0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65  age->isInit ) re
72b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
72c0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
72d0: 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65  rent==0 && pPare
72e0: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  nt!=0 ){.    pPa
72f0: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ge->pParent = pP
7300: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
7310: 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
7320: 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
7330: 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  }.  hdr = pPage-
7340: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
7350: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7360: 61 3b 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46  a;.  if( decodeF
7370: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
7380: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
7390: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
73a0: 4b 50 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70  KPT;.  assert( p
73b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
73c0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
73d0: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70  ze<=32768 );.  p
73e0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
73f0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
7400: 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76   1;.  pPage->nOv
7410: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50  erflow = 0;.  pP
7420: 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
7430: 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  0;.  usableSize 
7440: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
7450: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  e;.  pPage->cell
7460: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
7470: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
7480: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
7490: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
74a0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
74b0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
74c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
74d0: 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70  hdr+3]);.  if( p
74e0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
74f0: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
7500: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
7510: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
7520: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
7530: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
7540: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7550: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7560: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7570: 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50  ->nCell==0 && pP
7580: 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61 72  arent!=0 && pPar
7590: 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a  ent->pgno!=1 ){.
75a0: 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73      /* All pages
75b0: 20 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c 65   must have at le
75c0: 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78  ast one cell, ex
75d0: 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70 61  cept for root pa
75e0: 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ges */.    retur
75f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7600: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
7610: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
7620: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
7630: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70   the page */.  p
7640: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
7650: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46  ta[hdr+1]);.  nF
7660: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
7670: 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f  ] + top - (cellO
7680: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
7690: 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65  >nCell);.  while
76a0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e  ( pc>0 ){.    in
76b0: 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  t next, size;.  
76c0: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
76d0: 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f  ize-4 ){.      /
76e0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  * Free block is 
76f0: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
7700: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7710: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7720: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78  ; .    }.    nex
7730: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
7740: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a  ta[pc]);.    siz
7750: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
7760: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
7770: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
7780: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
7790: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
77a0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
77b0: 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
77c0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
77d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
77e0: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
77f0: 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20  nFree += size;. 
7800: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
7810: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
7820: 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28 20   = nFree;.  if( 
7830: 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a  nFree>=usableSiz
7840: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65  e ){.    /* Free
7850: 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78   space cannot ex
7860: 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20  ceed total page 
7870: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  size */.    retu
7880: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7890: 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 23 69  T_BKPT; .  }..#i
78a0: 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  f 0.  /* Check t
78b0: 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66 73  hat all the offs
78c0: 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 20  ets in the cell 
78d0: 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72 65  offset array are
78e0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 0a   within range. .
78f0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74 74    ** .  ** Omitt
7900: 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69 73 74  ing this consist
7910: 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64 20 75  ency check and u
7920: 73 69 6e 67 20 74 68 65 20 70 50 61 67 65 2d 3e  sing the pPage->
7930: 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20 20  maskPage mask.  
7940: 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 76  ** to prevent ov
7950: 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20 70 61  errunning the pa
7960: 67 65 20 62 75 66 66 65 72 20 69 6e 20 66 69 6e  ge buffer in fin
7970: 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74 73 20  dCell() results 
7980: 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20 70  in a.  ** 2.5% p
7990: 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e 2e  erformance gain.
79a0: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 38  .  */.  {.    u8
79b0: 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20 2f   *pOff;        /
79c0: 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
79d0: 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65 6c  to check all cel
79e0: 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69 6e  l offsets are in
79f0: 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75 38   range */.    u8
7a00: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 2f   *pEnd;        /
7a10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 64  * Pointer to end
7a20: 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 20   of cell offset 
7a30: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75 38 20  array */.    u8 
7a40: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a  mask;         /*
7a50: 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74 68   Mask of bits th
7a60: 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 20  at must be zero 
7a70: 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20 6f  in MSB of cell o
7a80: 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d 61  ffsets */.    ma
7a90: 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42 74  sk = ~(((u8)(pBt
7aa0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29 2d  ->pageSize>>8))-
7ab0: 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26  1);.    pEnd = &
7ac0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
7ad0: 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32  + pPage->nCell*2
7ae0: 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66 66 3d  ];.    for(pOff=
7af0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
7b00: 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20 26 26  ]; pOff!=pEnd &&
7b10: 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b 29   !((*pOff)&mask)
7b20: 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20 20  ; pOff+=2);.    
7b30: 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20 29  if( pOff!=pEnd )
7b40: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7b50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7b60: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  PT;.    }.  }.#e
7b70: 6e 64 69 66 0a 0a 20 20 70 50 61 67 65 2d 3e 69  ndif..  pPage->i
7b80: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74  sInit = 1;.  ret
7b90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7ba0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
7bb0: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
7bc0: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
7bd0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
7be0: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
7bf0: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
7c00: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
7c10: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
7c20: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
7c30: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7c40: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
7c50: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
7c60: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
7c70: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
7c80: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
7c90: 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  nt first;..  ass
7ca0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
7cb0: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
7cc0: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
7cd0: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
7ce0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7cf0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
7d00: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
7d10: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
7d20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7d30: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
7d40: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
7d50: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
7d60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
7d70: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
7d80: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
7d90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7da0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7db0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73  tex) );.  /*mems
7dc0: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
7dd0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
7de0: 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61  e - hdr);*/.  da
7df0: 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b  ta[hdr] = flags;
7e00: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
7e10: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
7e20: 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20  TF_LEAF)==0);.  
7e30: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
7e40: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
7e50: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
7e60: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
7e70: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
7e80: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
7e90: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  e->nFree = pBt->
7ea0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
7eb0: 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  st;.  decodeFlag
7ec0: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
7ed0: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
7ee0: 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61  set = hdr;.  pPa
7ef0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
7f00: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
7f10: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
7f20: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
7f30: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
7f40: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33  pBt->pageSize<=3
7f50: 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65 2d  2768 );.  pPage-
7f60: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d  >maskPage = pBt-
7f70: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20  >pageSize - 1;. 
7f80: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
7f90: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   = 0;.  pPage->n
7fa0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
7fb0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
7fc0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
7fd0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
7fe0: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
7ff0: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
8000: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
8010: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
8020: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
8030: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
8040: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
8050: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
8060: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
8070: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
8080: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
8090: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
80a0: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
80b0: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
80c0: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
80d0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
80e0: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
80f0: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
8100: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
8110: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
8120: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
8130: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
8140: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
8150: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
8160: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
8170: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
8180: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
8190: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
81a0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
81b0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a  e3BtreeGetPage(.
81c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
81d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
81e0: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
81f0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
8200: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
8210: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
8220: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
8230: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
8240: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
8250: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
8260: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
8270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
8280: 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
8290: 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
82a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
82b0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44 62  age *pPage;.  Db
82c0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
82d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
82e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
82f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
8300: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
8310: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
8320: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
8330: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
8340: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
8350: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
8360: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
8370: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
8380: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
8390: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
83a0: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
83b0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
83c0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
83d0: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
83e0: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
83f0: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
8400: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
8410: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
8420: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
8430: 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67  00 : 0;.  *ppPag
8440: 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74  e = pPage;.  ret
8450: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8460: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
8470: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
8480: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
8490: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
84a0: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
84b0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
84c0: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
84d0: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
84e0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
84f0: 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  age() and sqlite
8500: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
8510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8520: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
8530: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
8540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8550: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8560: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
8570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8580: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
8590: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
85a0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
85b0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
85c0: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
85d0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
85e0: 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65  rent     /* Pare
85f0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nt of the page *
8600: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
8610: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8620: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
8630: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
8640: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
8650: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8660: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
8670: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
8680: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
8690: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
86a0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
86b0: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
86c0: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
86d0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
86e0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
86f0: 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  *ppPage, pParent
8700: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8710: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8720: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
8730: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
8740: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
8750: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
8770: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
8780: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
8790: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
87a0: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
87b0: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
87c0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
87d0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
87e0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
87f0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
8800: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8810: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
8820: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8830: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
8840: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8850: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
8860: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
8870: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
8880: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8890: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
88a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
88b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
88c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
88d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
88e0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
88f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
8900: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
8910: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
8920: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8930: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
8940: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
8950: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
8960: 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65  ge.** reaches ze
8970: 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  ro.  We need to 
8980: 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e  unref the pParen
8990: 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74  t pointer when t
89a0: 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a  hat.** happens..
89b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
89c0: 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62  ageDestructor(Db
89d0: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
89e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
89f0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
8a00: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
8a10: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
8a20: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  ;.  if( pPage ){
8a30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8a40: 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ge->isInit==0 ||
8a50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8a60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8a70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 69 66  mutex) );.    if
8a80: 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
8a90: 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
8aa0: 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e *pParent = pPa
8ab0: 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ge->pParent;.   
8ac0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
8ad0: 6e 74 2d 3e 70 42 74 3d 3d 70 50 61 67 65 2d 3e  nt->pBt==pPage->
8ae0: 70 42 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  pBt );.      pPa
8af0: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
8b00: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
8b10: 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  ge(pParent);.   
8b20: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73   }.    pPage->is
8b30: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Init = 0;.  }.}.
8b40: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
8b50: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
8b60: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
8b70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
8b80: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
8b90: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
8ba0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
8bb0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
8bc0: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
8bd0: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
8be0: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
8bf0: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
8c00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8c10: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
8c20: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
8c30: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
8c40: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
8c50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
8c60: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
8c70: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
8c80: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
8c90: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
8ca0: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
8cb0: 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  a, int pageSize)
8cc0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
8cd0: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  ge;.  assert( (p
8ce0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
8cf0: 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  );.  pPage = (Me
8d00: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
8d10: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
8d20: 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ta);.  if( pPage
8d30: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
8d40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8d50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
8d60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
8d70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
8d80: 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  it = 0;.    sqli
8d90: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
8da0: 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70  (pPage, pPage->p
8db0: 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Parent);.  }.}..
8dc0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
8dd0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
8de0: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
8df0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
8e00: 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  BtreeInvokeBusyH
8e10: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
8e20: 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53  g, int n){.  BtS
8e30: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
8e40: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
8e50: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
8e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8e70: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8e80: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
8e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
8ea0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
8eb0: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
8ec0: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
8ed0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
8ee0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
8ef0: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
8f00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
8f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
8f20: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
8f30: 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61  NULL.** a new da
8f40: 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61  tabase with a ra
8f50: 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65  ndom name is cre
8f60: 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64  ated.  This rand
8f70: 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61  omly named.** da
8f80: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
8f90: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
8fa0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
8fb0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
8fc0: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
8fd0: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
8fe0: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
8ff0: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
9000: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
9010: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
9020: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
9030: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
9040: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
9050: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
9060: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
9070: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
9080: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9090: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
90a0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
90c0: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
90d0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
90e0: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
90f0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9100: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
9110: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
9120: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
9130: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
9140: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
9150: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
9160: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
9170: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
9180: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
9190: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
91a0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
91b0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46  ;      /* The VF
91c0: 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
91d0: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53  s btree */.  BtS
91e0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
91f0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
9200: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
9210: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
9220: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
9230: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
9240: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
9250: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9260: 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b  .  int nReserve;
9270: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9280: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
9290: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
92a0: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
92b0: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
92c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
92d0: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
92e0: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
92f0: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
9300: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
9310: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
9320: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
9330: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
9340: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
9350: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
9360: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
9370: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
9380: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9390: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
93a0: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
93b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
93c0: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
93d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
93e0: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
93f0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
9400: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
9410: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
9420: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
9430: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
9440: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
9450: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
9460: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
9470: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9480: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
9490: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
94a0: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
94b0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
94c0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
94d0: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
94e0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
94f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9500: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
9510: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
9520: 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20  ->db = db;..#if 
9530: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9540: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
9550: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
9560: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
9570: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
9580: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
9590: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
95a0: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
95b0: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
95c0: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
95d0: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
95e0: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
95f0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
9600: 64 62 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d  db==0.   && (db-
9610: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
9620: 56 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a  Vtab)==0.   && z
9630: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
9640: 65 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20  ename[0].  ){.  
9650: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
9660: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
9670: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
9680: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
9690: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
96a0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
96b0: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
96c0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
96d0: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
96e0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
96f0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
9700: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
9710: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
9720: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
9730: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
9740: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
9750: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
9760: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9770: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
9780: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9790: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
97a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
97b0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
97c0: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
97d0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
97e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
97f0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
9800: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
9810: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
9820: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
9830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9840: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
9850: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
9860: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
9870: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
9880: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
9890: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
98a0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
98b0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
98c0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
98d0: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
98e0: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
98f0: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
9900: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20  pBt->pPager)).  
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
9920: 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
9930: 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
9940: 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
9950: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
9960: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
9970: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
9980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9990: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
99a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
99b0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
99c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
99d0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
99e0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
99f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9a00: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
9a10: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
9a20: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
9a30: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
9a40: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
9a50: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
9a60: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
9a70: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
9a80: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
9a90: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
9aa0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
9ab0: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
9ac0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9ad0: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
9ae0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
9af0: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
9b00: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
9b10: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
9b20: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
9b30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
9b40: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
9b50: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
9b60: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
9b70: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
9b80: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
9b90: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
9ba0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
9bb0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
9bc0: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
9bd0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
9be0: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
9bf0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
9c00: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
9c10: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
9c20: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
9c30: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
9c40: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
9c50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9c60: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
9c70: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
9c80: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9c90: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
9ca0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
9cb0: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
9cc0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9cd0: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
9ce0: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
9cf0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
9d00: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
9d10: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
9d20: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
9d30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
9d40: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
9d50: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
9d60: 42 74 2d 3e 62 75 73 79 48 64 72 2e 78 46 75 6e  Bt->busyHdr.xFun
9d70: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9d80: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
9d90: 72 3b 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79  r;.    pBt->busy
9da0: 48 64 72 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a  Hdr.pArg = pBt;.
9db0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9dc0: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
9dd0: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
9de0: 69 6c 65 6e 61 6d 65 2c 20 70 61 67 65 44 65 73  ilename, pageDes
9df0: 74 72 75 63 74 6f 72 2c 0a 20 20 20 20 20 20 20  tructor,.       
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
9e20: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b  lags, vfsFlags);
9e30: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
9e40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9e50: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9e60: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
9e70: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
9e80: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
9e90: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
9ea0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9eb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
9ec0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
9ed0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ut;.    }.    sq
9ee0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
9ef0: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
9f00: 61 67 65 72 2c 20 26 70 42 74 2d 3e 62 75 73 79  ager, &pBt->busy
9f10: 48 64 72 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  Hdr);.    p->pBt
9f20: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73   = pBt;.  .    s
9f30: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
9f40: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
9f50: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
9f60: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
9f70: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
9f80: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
9f90: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
9fa0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
9fb0: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
9fc0: 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  er);.    pBt->pa
9fd0: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
9fe0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  e(&zDbHeader[16]
9ff0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
a000: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
a010: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
a020: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
a030: 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
a040: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
a050: 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
a060: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
a070: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
a080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
a090: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
a0a0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
a0b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e  >pageSize);.#ifn
a0c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a0d0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
a0e0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
a0f0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
a100: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
a110: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
a120: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
a130: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
a140: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
a150: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
a160: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
a170: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
a180: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
a190: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
a1a0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
a1b0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
a1c0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
a1d0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
a1e0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
a1f0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
a200: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
a210: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
a220: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
a230: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
a240: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
a250: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
a260: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
a270: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
a280: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
a290: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
a2a0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
a2b0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
a2c0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
a2d0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
a2e0: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
a2f0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
a300: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
a310: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
a320: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
a330: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
a340: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
a350: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
a360: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
a370: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
a380: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
a390: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
a3a0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
a3b0: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
a3c0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
a3d0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
a3e0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
a3f0: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
a400: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
a410: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a420: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
a430: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
a440: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
a450: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
a460: 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
a470: 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
a480: 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
a490: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
a4a0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
a4b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
a4c0: 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
a4d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a4e0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
a4f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a500: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
a510: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
a520: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
a530: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
a540: 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
a550: 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
a560: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
a570: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a580: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
a590: 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  red;.      pBt->
a5a0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
a5b0: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
a5c0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
a5d0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
a5e0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
a5f0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
a600: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
a610: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
a620: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
a630: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
a640: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
a650: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a660: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
a670: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
a680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a690: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
a6a0: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
a6b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
a6c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
a6d0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
a6e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a6f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a700: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
a710: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
a720: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
a730: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
a740: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a750: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
a760: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
a770: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a780: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
a790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
a7a0: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
a7b0: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
a7c0: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
a7d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a7e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
a7f0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a800: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
a810: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
a820: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
a830: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
a840: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
a850: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
a860: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
a870: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
a880: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
a890: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
a8a0: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
a8b0: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
a8c0: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
a8d0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
a8e0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
a8f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
a900: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
a910: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
a920: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
a930: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
a940: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
a950: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
a960: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
a970: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
a980: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
a990: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
a9a0: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
a9b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
a9c0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
a9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
a9e0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
a9f0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
aa00: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
aa10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
aa20: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
aa30: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
aa40: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
aa50: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
aa60: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
aa70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aa80: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
aa90: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
aaa0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
aab0: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
aac0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
aad0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
aae0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
aaf0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
ab00: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
ab10: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
ab20: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
ab30: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
ab40: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
ab50: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
ab60: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
ab70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ab80: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
ab90: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
aba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
abb0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
abc0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
abd0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
abe0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
abf0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
ac00: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
ac10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ac20: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
ac30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
ac40: 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
ac50: 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
ac60: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
ac70: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
ac80: 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
ac90: 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
aca0: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
acb0: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
acc0: 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
acd0: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
ace0: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
acf0: 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
ad00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
ad10: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
ad20: 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
ad30: 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
ad40: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ad50: 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f  CACHE.  sqlite3_
ad60: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a  mutex *pMaster;.
ad70: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
ad80: 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
ad90: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
ada0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
adb0: 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
adc0: 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20  x) );.  pMaster 
add0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ade0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
adf0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
ae00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ae10: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
ae20: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
ae30: 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
ae40: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
ae50: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
ae60: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
ae70: 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
ae80: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
ae90: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
aea0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
aeb0: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
aec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
aed0: 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
aee0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
aef0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
af00: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
af10: 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
af20: 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
af30: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
af40: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
af50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
af60: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
af70: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
af80: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
af90: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
afa0: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
afb0: 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
afc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
afd0: 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
afe0: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
aff0: 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
b000: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b010: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
b020: 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
b030: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
b040: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
b050: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
b060: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
b070: 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
b080: 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
b090: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
b0a0: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
b0b0: 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
b0c0: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
b0d0: 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
b0e0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
b0f0: 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
b100: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
b110: 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
b120: 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Size );.  }.}../
b130: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
b140: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
b150: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
b160: 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
b170: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
b180: 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
b190: 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
b1a0: 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
b1b0: 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
b1c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
b1d0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
b1e0: 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
b1f0: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
b200: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
b210: 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
b220: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
b230: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
b240: 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
b250: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
b260: 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
b270: 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
b280: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b290: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
b2a0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
b2b0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
b2c0: 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
b2d0: 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d   p->db;.  pCur =
b2e0: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
b2f0: 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
b300: 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
b310: 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
b320: 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
b330: 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
b340: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
b350: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
b360: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
b370: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
b380: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
b390: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
b3a0: 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
b3b0: 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
b3c0: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
b3d0: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
b3e0: 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
b3f0: 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
b400: 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
b410: 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
b420: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
b430: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69  lback(p);.  sqli
b440: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
b450: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
b460: 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
b470: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
b480: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
b490: 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
b4a0: 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
b4b0: 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
b4c0: 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
b4d0: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
b4e0: 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
b4f0: 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
b500: 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
b510: 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
b520: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
b530: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
b540: 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
b550: 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
b560: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
b570: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
b580: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
b590: 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
b5a0: 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
b5b0: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
b5c0: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
b5d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
b5e0: 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
b5f0: 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
b600: 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
b610: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
b620: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
b630: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
b640: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
b650: 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
b660: 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
b670: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
b680: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
b690: 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
b6a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b6b0: 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63  e3_free(pBt->pSc
b6c0: 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54  hema);.    freeT
b6d0: 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
b6e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
b6f0: 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
b700: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b710: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
b720: 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
b730: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
b740: 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
b750: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
b760: 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
b770: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
b780: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
b790: 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
b7a0: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
b7b0: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
b7c0: 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
b7d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b7e0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b7f0: 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
b800: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
b810: 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
b820: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
b830: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
b840: 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
b850: 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
b860: 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
b870: 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
b880: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
b890: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
b8a0: 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
b8b0: 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
b8c0: 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
b8d0: 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
b8e0: 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
b8f0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
b900: 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
b910: 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
b920: 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
b930: 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
b940: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
b950: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
b960: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
b970: 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
b980: 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
b990: 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
b9a0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
b9b0: 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
b9c0: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
b9d0: 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
b9e0: 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
b9f0: 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
ba00: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
ba10: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
ba20: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
ba30: 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
ba40: 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
ba50: 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
ba60: 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
ba70: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
ba80: 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
ba90: 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  worry..*/.int sq
baa0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
bab0: 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
bac0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
bad0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
bae0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
baf0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
bb00: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
bb10: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
bb20: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
bb30: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
bb40: 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
bb50: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
bb60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
bb70: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
bb80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bb90: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
bba0: 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
bbb0: 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
bbc0: 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
bbd0: 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
bbe0: 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
bbf0: 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
bc00: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
bc10: 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
bc20: 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
bc30: 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
bc40: 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
bc50: 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
bc60: 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
bc70: 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
bc80: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
bc90: 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
bca0: 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
bcb0: 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
bcc0: 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
bcd0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
bce0: 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
bcf0: 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
bd00: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
bd10: 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
bd20: 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
bd30: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
bd40: 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
bd50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bd60: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
bd70: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
bd80: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72  tSafetyLevel(Btr
bd90: 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c  ee *p, int level
bda0: 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b  , int fullSync){
bdb0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
bdc0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
bdd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
bde0: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
bdf0: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
be00: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
be10: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
be20: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
be30: 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c  t->pPager, level
be40: 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73  , fullSync);.  s
be50: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
be60: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
be70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
be80: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
be90: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
bea0: 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
beb0: 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
bec0: 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
bed0: 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
bee0: 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
bef0: 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
bf00: 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
bf10: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
bf20: 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
bf30: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
bf40: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
bf50: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
bf60: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
bf70: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
bf80: 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
bf90: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
bfa0: 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
bfb0: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
bfc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
bfd0: 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
bfe0: 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
bff0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
c000: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c010: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
c020: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
c030: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
c040: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
c050: 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68  VACUUM)./*.** Ch
c060: 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
c070: 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
c080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
c090: 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
c0a0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
c0b0: 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
c0c0: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
c0d0: 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
c0e0: 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
c0f0: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
c100: 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
c110: 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
c120: 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
c130: 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
c140: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
c150: 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
c160: 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
c170: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
c180: 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
c190: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
c1a0: 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
c1b0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
c1c0: 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
c1d0: 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
c1e0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
c1f0: 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
c200: 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
c210: 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
c220: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
c230: 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
c240: 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
c250: 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
c260: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
c270: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
c280: 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
c290: 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
c2a0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
c2b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
c2c0: 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
c2d0: 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
c2e0: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
c2f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c300: 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
c310: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
c320: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c330: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
c340: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
c350: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
c360: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c370: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c380: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
c390: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
c3a0: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
c3b0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c3c0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c3d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65  ;.  }.  if( page
c3e0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
c3f0: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
c400: 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
c410: 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
c420: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
c430: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
c440: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
c450: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
c460: 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
c470: 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
c480: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
c490: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
c4a0: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
c4b0: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  ce(pBt);.    rc 
c4c0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
c4d0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
c4e0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
c4f0: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
c500: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
c510: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c520: 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69  nReserve;.  sqli
c530: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c540: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c550: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c560: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
c570: 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
c580: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c590: 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
c5a0: 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
c5b0: 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
c5c0: 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ze;.}.int sqlite
c5d0: 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
c5e0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
c5f0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
c600: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
c610: 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
c620: 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
c630: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
c640: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c650: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c660: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
c670: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
c680: 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
c690: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
c6a0: 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
c6b0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
c6c0: 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
c6d0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
c6e0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
c6f0: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
c700: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
c710: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
c720: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c730: 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
c740: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
c750: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
c760: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c770: 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
c780: 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
c790: 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
c7a0: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
c7b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c7c0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
c7d0: 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
c7e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c7f0: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
c800: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
c810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
c820: 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
c830: 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
c840: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
c850: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
c860: 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
c870: 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
c880: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
c890: 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
c8a0: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
c8b0: 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
c8c0: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
c8d0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
c8e0: 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
c8f0: 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
c900: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
c910: 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
c920: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
c930: 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
c940: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
c950: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
c960: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
c970: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
c980: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
c990: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c9a0: 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
c9b0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
c9c0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
c9d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c9e0: 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f    int av = (auto
c9f0: 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20  Vacuum?1:0);..  
ca00: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
ca10: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
ca20: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26  >pageSizeFixed &
ca30: 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56  & av!=pBt->autoV
ca40: 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
ca50: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
ca60: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
ca70: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
ca80: 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  = av;.  }.  sqli
ca90: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
caa0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
cab0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
cac0: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
cad0: 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
cae0: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
caf0: 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
cb00: 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
cb10: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
cb20: 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
cb30: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
cb40: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
cb50: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
cb60: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
cb70: 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
cb80: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
cb90: 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
cba0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
cbb0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
cbc0: 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
cbd0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
cbe0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
cbf0: 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
cc00: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
cc10: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
cc20: 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
cc30: 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
cc40: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
cc50: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
cc60: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
cc70: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
cc80: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
cc90: 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
cca0: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
ccb0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
ccc0: 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
ccd0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
cce0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
ccf0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
cd00: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
cd10: 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
cd20: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
cd30: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
cd40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
cd50: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
cd60: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
cd70: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
cd80: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
cd90: 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
cda0: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
cdb0: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
cdc0: 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
cdd0: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
cde0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
cdf0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
ce00: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
ce10: 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73  int nPage;..  as
ce20: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
ce30: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
ce40: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
ce50: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
ce60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ce70: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
ce80: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
ce90: 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
cea0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ceb0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
cec0: 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
ced0: 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
cee0: 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
cef0: 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
cf00: 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
cf10: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
cf20: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
cf30: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
cf40: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
cf50: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
cf60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cf70: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
cf80: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73  t_failed;.  }els
cf90: 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b  e if( nPage>0 ){
cfa0: 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a  .    int pageSiz
cfb0: 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  e;.    int usabl
cfc0: 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
cfd0: 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
cfe0: 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
cff0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
d000: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
d010: 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
d020: 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
d030: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d040: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
d050: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
d060: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
d070: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
d080: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
d090: 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
d0a0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d0b0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
d0c0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
d0d0: 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
d0e0: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
d0f0: 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
d100: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
d110: 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
d120: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
d130: 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
d140: 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
d150: 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
d160: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
d170: 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
d180: 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
d190: 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
d1a0: 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
d1b0: 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
d1c0: 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
d1d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d1e0: 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
d1f0: 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
d200: 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
d210: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
d220: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
d230: 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65     pageSize = ge
d240: 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36  t2byte(&page1[16
d250: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  ]);.    if( ((pa
d260: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
d270: 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69  ze)!=0 || pageSi
d280: 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20  ze<512 ||.      
d290: 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41    (SQLITE_MAX_PA
d2a0: 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26  GE_SIZE<32768 &&
d2b0: 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
d2c0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a  _MAX_PAGE_SIZE).
d2d0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
d2e0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
d2f0: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
d300: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
d310: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
d320: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
d330: 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
d340: 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  ];.    if( pageS
d350: 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
d360: 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
d370: 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
d380: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
d390: 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
d3a0: 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
d3b0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
d3c0: 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
d3d0: 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
d3e0: 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
d3f0: 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
d400: 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
d410: 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
d420: 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
d430: 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
d440: 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
d450: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d460: 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
d470: 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
d480: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
d490: 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
d4a0: 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
d4b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d4c0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
d4d0: 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
d4e0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
d4f0: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
d500: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
d510: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
d520: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
d530: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d540: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
d550: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
d560: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
d570: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d580: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
d590: 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
d5a0: 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  500 ){.      got
d5b0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
d5c0: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
d5d0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
d5e0: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
d5f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
d600: 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
d610: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d620: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
d630: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
d640: 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
d650: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
d660: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
d670: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
d680: 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
d690: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
d6a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
d6b0: 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
d6c0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
d6d0: 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
d6e0: 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
d6f0: 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
d700: 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
d710: 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
d720: 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
d730: 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
d740: 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
d750: 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
d760: 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
d770: 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
d780: 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
d790: 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
d7a0: 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
d7b0: 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
d7c0: 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
d7d0: 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
d7e0: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
d7f0: 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
d800: 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
d810: 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
d820: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
d830: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
d840: 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
d850: 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
d860: 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c  a 2-byte poiner,
d870: 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
d880: 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
d890: 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
d8a0: 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
d8b0: 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
d8c0: 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
d8d0: 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
d8e0: 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
d8f0: 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
d900: 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
d910: 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
d920: 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 23;.  pBt->mi
d930: 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  nLocal = (pBt->u
d940: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
d950: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
d960: 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
d970: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
d980: 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
d990: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
d9a0: 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
d9b0: 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70   23;.  assert( p
d9c0: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
d9d0: 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
d9e0: 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
d9f0: 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
da00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
da10: 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
da20: 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
da30: 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
da40: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
da50: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
da60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
da70: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
da80: 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63   lockBtree() exc
da90: 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f  ept that it also
daa0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
dab0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
dac0: 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63   there is lock c
dad0: 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ontention..*/.st
dae0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
daf0: 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65  eeWithRetry(Btre
db00: 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20  e *pRef){.  int 
db10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
db20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
db30: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
db40: 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28  x(pRef) );.  if(
db50: 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
db60: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
db70: 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
db80: 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
db90: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
dba0: 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
dbb0: 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
dbc0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
dbd0: 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
dbe0: 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
dbf0: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
dc00: 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
dc10: 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
dc20: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
dc30: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
dc40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
dc50: 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
dc60: 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
dc70: 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
dc80: 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
dc90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
dca0: 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
dcb0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
dcc0: 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
dcd0: 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
dce0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
dcf0: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
dd00: 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
dd10: 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
dd20: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
dd30: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
dd40: 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
dd50: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
dd60: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
dd70: 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
dd80: 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
dd90: 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
dda0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
ddb0: 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
ddc0: 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
ddd0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
dde0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
ddf0: 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
de00: 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
de10: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
de20: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
de30: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
de40: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
de50: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
de60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
de70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
de80: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
de90: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
dea0: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
deb0: 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  && pBt->pCursor=
dec0: 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  =0 && pBt->pPage
ded0: 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  1!=0 ){.    if( 
dee0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
def0: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
df00: 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73  )>=1 ){.      as
df10: 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
df20: 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69 66 20  1->aData );.#if 
df30: 30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  0.      if( pBt-
df40: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d  >pPage1->aData==
df50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  0 ){.        Mem
df60: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42  Page *pPage = pB
df70: 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20  t->pPage1;.     
df80: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
df90: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
dfa0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
dfb0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
dfc0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
dfd0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
dfe0: 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  pgno = 1;.      
dff0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
e000: 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
e010: 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
e020: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
e030: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53   0;.    pBt->inS
e040: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 0;.  }.}..
e050: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
e060: 65 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ew database by i
e070: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
e080: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
e090: 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  e.** file..*/.st
e0a0: 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
e0b0: 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
e0c0: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
e0d0: 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
e0e0: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
e0f0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67  t rc;.  int nPag
e100: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
e110: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e120: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
e130: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e140: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
e150: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
e160: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e170: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e  ITE_OK || nPage>
e180: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
e190: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  rc;.  }.  pP1 = 
e1a0: 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
e1b0: 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
e1c0: 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
e1d0: 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
e1e0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
e1f0: 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
e200: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
e210: 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
e220: 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
e230: 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
e240: 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
e250: 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
e260: 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
e270: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31  put2byte(&data[1
e280: 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  6], pBt->pageSiz
e290: 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  e);.  data[18] =
e2a0: 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
e2b0: 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d   1;.  data[20] =
e2c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
e2d0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
e2e0: 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
e2f0: 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
e300: 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
e310: 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
e320: 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
e330: 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
e340: 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
e350: 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
e360: 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
e370: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
e380: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
e390: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e3a0: 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
e3b0: 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
e3c0: 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
e3d0: 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
e3e0: 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
e3f0: 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
e400: 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
e410: 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
e420: 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
e430: 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
e440: 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
e450: 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
e460: 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
e470: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e480: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  _OK;.}../*.** At
e490: 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
e4a0: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
e4b0: 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
e4c0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
e4d0: 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
e4e0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
e4f0: 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
e500: 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
e510: 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
e520: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e530: 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
e540: 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
e550: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
e560: 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
e570: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
e580: 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
e590: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
e5a0: 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
e5b0: 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
e5c0: 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
e5d0: 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
e5e0: 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
e5f0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
e600: 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
e610: 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
e620: 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
e630: 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
e640: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
e650: 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
e660: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
e670: 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
e680: 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
e690: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
e6a0: 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
e6b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e6c0: 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
e6d0: 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
e6e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
e6f0: 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
e700: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
e710: 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
e720: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
e730: 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
e740: 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
e750: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
e760: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
e770: 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
e780: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
e790: 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
e7a0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
e7b0: 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
e7c0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e7d0: 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
e7e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
e7f0: 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
e800: 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
e810: 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
e820: 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
e830: 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
e840: 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
e850: 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
e860: 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
e870: 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
e880: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
e890: 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
e8a0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
e8b0: 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
e8c0: 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
e8d0: 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
e8e0: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
e8f0: 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
e900: 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
e910: 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
e920: 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
e930: 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
e940: 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
e950: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
e960: 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
e970: 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
e980: 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
e990: 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
e9a0: 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
e9b0: 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
e9c0: 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
e9d0: 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
e9e0: 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
e9f0: 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
ea00: 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
ea10: 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
ea20: 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
ea30: 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
ea40: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
ea50: 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
ea60: 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
ea70: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
ea80: 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
ea90: 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
eaa0: 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
eab0: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
eac0: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
ead0: 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
eae0: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
eaf0: 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
eb00: 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
eb10: 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
eb20: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
eb30: 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
eb40: 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
eb50: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
eb60: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
eb70: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
eb80: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
eb90: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
eba0: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
ebb0: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
ebc0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
ebd0: 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
ebe0: 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
ebf0: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
ec00: 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
ec10: 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
ec20: 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
ec30: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
ec40: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
ec50: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
ec60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
ec70: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
ec80: 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
ec90: 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
eca0: 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
ecb0: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
ecc0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
ecd0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
ece0: 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
ecf0: 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
ed00: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
ed10: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
ed20: 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
ed30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
ed40: 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
ed50: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
ed60: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  ..  /* If anothe
ed70: 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
ed80: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
ed90: 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
eda0: 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
edb0: 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
edc0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
edd0: 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
ede0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
edf0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
ee00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ee10: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  SY..  */.  if( p
ee20: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
ee30: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
ee40: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
ee50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
ee60: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
ee70: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
ee80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ee90: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
eea0: 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
eeb0: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
eec0: 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
eed0: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
eee0: 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
eef0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
ef00: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
ef10: 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=p ){.        r
ef20: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
ef30: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74 72  .        goto tr
ef40: 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20  ans_begun;.     
ef50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
ef60: 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20  dif..  do {.    
ef70: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
ef80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  =0 ){.      do{.
ef90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63          rc = loc
efa0: 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
efb0: 20 20 20 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e     }while( pBt->
efc0: 70 50 61 67 65 31 3d 3d 30 20 26 26 20 72 63 3d  pPage1==0 && rc=
efd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
efe0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
eff0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
f000: 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
f010: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
f020: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f030: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
f040: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f050: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f060: 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
f070: 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
f080: 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  e, wrflag>1);.  
f090: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f0a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f0b0: 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
f0c0: 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
f0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f0e0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
f0f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f100: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
f110: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
f120: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
f130: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
f140: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
f150: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
f160: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
f170: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
f180: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
f190: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71   &&.          sq
f1a0: 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65  lite3BtreeInvoke
f1b0: 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2c  BusyHandler(pBt,
f1c0: 20 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63   0) );..  if( rc
f1d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f1e0: 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
f1f0: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
f200: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
f210: 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
f220: 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
f230: 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
f240: 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
f250: 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
f260: 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
f270: 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
f280: 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
f290: 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
f2a0: 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ns;.    }.#ifnde
f2b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
f2c0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69  ARED_CACHE.    i
f2d0: 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
f2e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
f2f0: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 29 3b  t->pExclusive );
f300: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 45 78 63  .      pBt->pExc
f310: 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20 20 20 20  lusive = p;.    
f320: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
f330: 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74  rans_begun:.  bt
f340: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
f350: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
f360: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
f370: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
f380: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
f390: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
f3a0: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 20 4f  ile in pages.  O
f3b0: 72 20 72 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a  r return -1 if.*
f3c0: 2a 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  * there is any k
f3d0: 69 6e 64 20 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f  ind of error..*/
f3e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
f3f0: 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
f400: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
f410: 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
f420: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
f430: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
f440: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
f450: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
f460: 4c 49 54 45 5f 4f 4b 3f 6e 50 61 67 65 3a 2d 31  LITE_OK?nPage:-1
f470: 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
f480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f490: 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
f4a0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
f4b0: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
f4c0: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
f4d0: 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
f4e0: 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
f4f0: 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
f500: 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
f510: 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
f520: 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
f530: 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
f540: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
f550: 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
f560: 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
f570: 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
f580: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
f5b0: 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
f5c0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f5f0: 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
f600: 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
f610: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f640: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
f650: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
f660: 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67    int isInitOrig
f670: 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
f680: 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
f690: 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
f6a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f6b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
f6c0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
f6d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
f6e0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
f6f0: 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ge, pPage->pPare
f700: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  nt);.  if( rc!=S
f710: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f720: 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
f730: 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a  trmaps_out;.  }.
f740: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
f750: 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
f760: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
f770: 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
f780: 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
f790: 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d  e, i);..    rc =
f7a0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
f7b0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
f7c0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f7d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f7e0: 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
f7f0: 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
f800: 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
f810: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
f820: 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
f830: 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
f840: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
f850: 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
f860: 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
f870: 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  TREE, pgno);.   
f880: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f890: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
f8a0: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
f8b0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
f8c0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
f8d0: 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
f8e0: 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
f8f0: 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
f900: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
f910: 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
f920: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
f930: 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
f940: 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
f950: 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
f960: 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
f970: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
f980: 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
f990: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
f9a0: 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
f9b0: 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
f9c0: 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  enteed to be a b
f9d0: 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
f9e0: 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
f9f0: 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
fa00: 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
fa10: 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
fa20: 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
fa30: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
fa40: 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
fa50: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
fa60: 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
fa70: 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
fa80: 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
fa90: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
faa0: 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
fab0: 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
fac0: 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
fad0: 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
fb00: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
fb10: 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
fb20: 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
fb30: 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
fb40: 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
fb50: 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
fb60: 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
fb70: 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
fb80: 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
fb90: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
fba0: 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
fbb0: 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
fbc0: 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
fbd0: 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
fbe0: 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
fc00: 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
fc10: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
fc20: 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
fc30: 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
fc40: 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
fc50: 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
fc60: 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
fc70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fc80: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
fc90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
fca0: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
fcb0: 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
fcc0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
fcd0: 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
fce0: 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
fcf0: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
fd00: 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
fd10: 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
fd20: 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
fd30: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fd40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
fd50: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
fd60: 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
fd70: 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
fd80: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e  se{.    int isIn
fd90: 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
fda0: 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
fdb0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
fdc0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ;..    sqlite3Bt
fdd0: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
fde0: 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  e, 0);.    nCell
fdf0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
fe00: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
fe10: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
fe20: 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
fe30: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
fe40: 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
fe50: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
fe60: 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
fe70: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
fe80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
fe90: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
fea0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
feb0: 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
fec0: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
fed0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
fee0: 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
fef0: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
ff00: 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20  Overflow]) ){.  
ff10: 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
ff20: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
ff30: 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
ff40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
ff50: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
ff60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ff70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
ff80: 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
ff90: 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
ffa0: 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
ffb0: 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
ffc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ffd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ffe0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
fff0: 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
10000 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
10010 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
10020 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
10030 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
10040 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10050 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
10060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10070 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
10080 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
10090 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
100a0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
100b0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
100c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
100d0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
100e0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
100f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10100 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
10110 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
10120 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
10130 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
10140 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
10150 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
10160 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
10170 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
10180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
10190 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
101a0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
101b0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
101c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
101d0 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
101e0 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
101f0 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
10200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10210 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
10220 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
10230 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
10240 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
10250 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
10260 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
10270 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
10280 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
10290 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
102a0 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
102b0 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
102c0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
102d0 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  mmit.){.  MemPag
102e0 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
102f0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
10300 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
10310 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
10320 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
10330 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
10340 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
10350 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
10360 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
10370 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
10380 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
10390 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
103a0 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
103b0 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
103c0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
103d0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
103e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
103f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10400 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10410 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
10420 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
10430 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
10440 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
10450 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
10460 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
10470 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
10480 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
10490 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
104a0 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
104b0 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
104c0 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
104d0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
104e0 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
104f0 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
10500 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
10510 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
10520 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
10530 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
10540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10550 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
10560 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
10570 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
10580 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
10590 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
105a0 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
105b0 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
105c0 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
105d0 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
105e0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
105f0 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
10600 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
10610 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
10620 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
10630 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
10640 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
10650 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
10660 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
10670 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
10680 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
10690 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
106a0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
106b0 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
106c0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
106d0 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
106e0 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
106f0 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
10700 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
10710 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
10720 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
10730 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
10740 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
10750 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
10760 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
10770 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
10780 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10790 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
107a0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
107b0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
107c0 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
107d0 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
107e0 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
107f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
10800 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
10810 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
10820 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
10830 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  eePage);.      i
10840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10850 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10860 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
10870 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
10880 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
10890 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
108a0 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
108b0 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
108c0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
108d0 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
108e0 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
108f0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
10900 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
10910 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
10920 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
10930 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
10940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10950 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
10960 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
10970 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
10980 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
109a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
109b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
109c0 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
109d0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
109e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
109f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
10a00 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
10a10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10a20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
10a30 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
10a40 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
10a50 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
10a60 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
10a70 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
10a80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10aa0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
10ab0 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
10ac0 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a  ype, iPtrPage);.
10ad0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10ae0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
10af0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
10b00 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
10b10 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
10b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
10b30 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
10b40 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
10b50 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
10b60 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
10b70 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
10b80 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
10b90 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
10ba0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
10bb0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
10bc0 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
10bd0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
10be0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
10bf0 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c  .** point in cal
10c00 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
10c10 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
10c20 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  n SQLITE_DONE..*
10c30 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
10c40 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
10c50 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
10c60 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
10c70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20  .** database so 
10c80 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
10c90 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
10ca0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a  urrently in use.
10cb0 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
10cc0 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in use..**.** If
10cd0 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65   the nFin parame
10ce0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
10cf0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
10d00 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
10d10 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
10d20 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
10d30 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
10d40 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
10d50 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
10d60 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
10d70 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
10d80 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
10d90 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
10da0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
10db0 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
10dc0 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
10dd0 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61  complete..*/.sta
10de0 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
10df0 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
10e00 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29  *pBt, Pgno nFin)
10e10 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  {.  Pgno iLastPg
10e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10e30 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   Last page in th
10e40 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
10e50 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
10e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10e70 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
10e80 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
10e90 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
10ea0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10eb0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10ec0 20 29 3b 0a 20 20 69 4c 61 73 74 50 67 20 3d 20   );.  iLastPg = 
10ed0 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 69  pBt->nTrunc;.  i
10ee0 66 28 20 69 4c 61 73 74 50 67 3d 3d 30 20 29 7b  f( iLastPg==0 ){
10ef0 0a 20 20 20 20 69 4c 61 73 74 50 67 20 3d 20 70  .    iLastPg = p
10f00 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
10f10 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  t->pPager);.  }.
10f20 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
10f30 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
10f40 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
10f50 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
10f60 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e  E(pBt) ){.    in
10f70 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79  t rc;.    u8 eTy
10f80 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
10f90 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
10fa0 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
10fb0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
10fc0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
10fd0 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
10fe0 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50 67  || nFin==iLastPg
10ff0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11000 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
11010 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
11020 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
11030 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
11040 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
11050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11060 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11070 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
11080 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
11090 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
110a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
110b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
110c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
110d0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
110e0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
110f0 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
11100 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
11110 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
11120 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
11130 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
11140 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
11150 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d   if nFin is non-
11160 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
11170 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
11180 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
11190 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
111a0 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
111b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
111c0 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
111d0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
111e0 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
111f0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
11200 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
11210 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11220 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
11230 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
11240 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
11250 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
11260 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
11270 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
11280 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a  g, iLastPg, 1);.
11290 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
112a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
112b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
112c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
112d0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
112e0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
112f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
11300 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
11310 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
11320 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
11330 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
11340 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
11350 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
11360 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
11370 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
11380 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63  astPg;..      rc
11390 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
113a0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
113b0 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
113c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
113d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
113e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
113f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11400 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
11410 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
11420 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
11430 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
11440 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
11450 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
11460 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
11470 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
11480 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
11490 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
114a0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
114b0 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
114c0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
114d0 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
114e0 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
114f0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
11500 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
11510 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
11520 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
11530 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
11540 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
11550 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
11560 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
11570 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
11580 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
11590 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
115a0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
115b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
115c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
115d0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
115e0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
115f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
11600 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
11610 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
11620 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
11630 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
11640 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
11650 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
11660 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
11670 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
11680 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
11690 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
116a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
116b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
116c0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
116d0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
116e0 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
116f0 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
11700 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20  nFin!=0);.      
11710 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
11720 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
11730 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11750 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11760 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
11770 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69   pBt->nTrunc = i
11780 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68  LastPg - 1;.  wh
11790 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ile( pBt->nTrunc
117a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
117b0 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50  AGE(pBt)||PTRMAP
117c0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
117d0 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20  ->nTrunc) ){.   
117e0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a   pBt->nTrunc--;.
117f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11800 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11810 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
11820 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
11830 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
11840 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
11850 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
11860 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
11870 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
11880 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
11890 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
118a0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
118b0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
118c0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
118d0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
118e0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
118f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
11900 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
11910 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
11920 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  ccured,.** SQLIT
11930 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11940 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
11950 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
11960 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
11970 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
11980 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
11990 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
119a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
119b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
119c0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
119d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
119e0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
119f0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
11a00 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
11a10 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
11a20 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
11a30 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
11a40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
11a50 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
11a60 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
11a70 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
11a80 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56  ;.    rc = incrV
11a90 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30  acuumStep(pBt, 0
11aa0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11ab0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11ad0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11ae0 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
11af0 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
11b00 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
11b10 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
11b20 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e   commited for an
11b30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
11b40 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
11b50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
11b60 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
11b70 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
11b80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
11b90 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
11ba0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
11bb0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
11bc0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
11bd0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
11be0 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
11bf0 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
11c00 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
11c10 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
11c20 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
11c30 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
11c40 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
11c50 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
11c60 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e  d *pBt, Pgno *pn
11c70 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
11c80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11c90 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
11ca0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66  pBt->pPager;.#if
11cb0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
11cc0 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
11cd0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
11ce0 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ager);.#endif.. 
11cf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11d00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11d10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
11d20 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
11d30 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
11d40 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
11d50 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
11d60 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11d70 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
11d80 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
11d90 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b  Bt->nTrunc==0 ){
11da0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  .      Pgno nFre
11db0 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  e;.      Pgno nP
11dc0 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e  trmap;.      con
11dd0 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
11de0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
11df0 20 20 20 69 6e 74 20 6e 4f 72 69 67 20 3d 20 70     int nOrig = p
11e00 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
11e10 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  t->pPager);..   
11e20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
11e30 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
11e40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
11e50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11e60 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
11e70 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d        if( nOrig=
11e80 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
11e90 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
11ea0 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20     nOrig--;.    
11eb0 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
11ec0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
11ed0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
11ee0 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d  6]);.      nPtrm
11ef0 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
11f00 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
11f10 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a  pBt, nOrig)+pgsz
11f20 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20  /5)/(pgsz/5);.  
11f30 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67      nFin = nOrig
11f40 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
11f50 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  ap;.      if( nO
11f60 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
11f70 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
11f80 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in<=PENDING_BYTE
11f90 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
11fa0 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
11fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
11fc0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
11fd0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
11fe0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
11ff0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
12000 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
12010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12020 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
12030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12040 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
12050 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a  tep(pBt, nFin);.
12060 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
12070 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
12080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 46  .      assert(nF
12090 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54  in==0 || pBt->nT
120a0 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c  runc==0 || nFin<
120b0 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20  =pBt->nTrunc);. 
120c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
120d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  _OK;.      if( p
120e0 42 74 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e 46  Bt->nTrunc && nF
120f0 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  in ){.        rc
12100 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
12110 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
12120 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
12130 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
12140 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
12150 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
12160 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
12170 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
12180 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  6], 0);.        
12190 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46  pBt->nTrunc = nF
121a0 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
121b0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
121c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
121d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
121e0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
121f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
12200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12210 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20  .    *pnTrunc = 
12220 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20  pBt->nTrunc;.   
12230 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30   pBt->nTrunc = 0
12240 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12250 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67  nRef==sqlite3Pag
12260 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
12270 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
12280 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a  c;.}..#endif../*
12290 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
122a0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
122b0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
122c0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
122d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
122e0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
122f0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
12300 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
12310 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
12320 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
12330 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
12340 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
12350 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
12360 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
12370 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
12380 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
12390 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
123a0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
123b0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
123c0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
123d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
123e0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
123f0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
12400 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
12410 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
12420 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
12430 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
12440 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
12450 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
12460 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
12470 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
12480 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
12490 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
124a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
124b0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
124c0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
124d0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
124e0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
124f0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
12500 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
12510 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
12520 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
12530 6f 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20  ommit() for the 
12540 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
12550 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
12560 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
12570 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
12580 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
12590 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
125a0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
125b0 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
125c0 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
125d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
125e0 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
125f0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
12600 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
12610 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
12620 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
12630 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
12640 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
12650 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
12660 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
12670 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
12680 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12690 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
126a0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
126b0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
126c0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
126d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
126e0 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
126f0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
12700 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
12710 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
12720 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
12730 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
12740 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
12750 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
12760 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
12770 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
12780 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
12790 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
127a0 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
127b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
127c0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
127d0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
127e0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
127f0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
12800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
12810 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
12820 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12830 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
12840 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
12850 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12860 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67  = p->pBt;.    Pg
12870 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20  no nTrunc = 0;. 
12880 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
12890 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74  nter(p);.    pBt
128a0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69  ->db = p->db;.#i
128b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
128c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
128d0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
128e0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
128f0 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
12900 6d 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63  mit(pBt, &nTrunc
12910 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ); .      if( rc
12920 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12930 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
12940 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
12950 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12960 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
12970 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
12980 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
12990 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
129a0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  ager, zMaster, n
129b0 54 72 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73  Trunc, 0);.    s
129c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
129d0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
129e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
129f0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
12a00 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
12a10 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
12a20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12a30 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
12a40 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
12a50 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
12a60 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
12a70 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74  BtreeSync() rout
12a80 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
12a90 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
12aa0 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a  uld be invoked.*
12ab0 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  * prior to calli
12ac0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
12ad0 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
12ae0 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65  eeSync() routine
12af0 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20   did.** all the 
12b00 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
12b10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
12b20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
12b30 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
12b40 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
12b50 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
12b60 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
12b70 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
12b80 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
12b90 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
12ba0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f   truncate the ro
12bb0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a  llback journal.*
12bc0 2a 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  * (which causes 
12bd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12be0 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64  to commit) and d
12bf0 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  rop locks..**.**
12c00 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
12c10 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
12c20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
12c30 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
12c40 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
12c50 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
12c60 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
12c70 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
12c80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
12c90 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
12ca0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
12cb0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12cc0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
12cd0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
12ce0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
12cf0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12d00 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
12d10 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
12d20 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
12d30 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
12d40 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
12d50 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
12d60 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
12d70 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
12d80 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
12d90 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
12da0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
12db0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
12dc0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
12dd0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
12de0 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
12df0 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
12e00 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
12e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12e20 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
12e30 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
12e40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12e50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
12e60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12e70 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
12e80 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
12e90 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12ea0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
12eb0 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
12ec0 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63  = 0;.  }.  unloc
12ed0 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a  kAllTables(p);..
12ee0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
12ef0 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20  le has any kind 
12f00 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
12f10 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
12f20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
12f30 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65   ** count of the
12f40 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
12f50 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
12f60 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  n count reaches 
12f70 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20  0, set.  ** the 
12f80 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
12f90 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
12fa0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
12fb0 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77  sed() call below
12fc0 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63  .  ** will unloc
12fd0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  k the pager..  *
12fe0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
12ff0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
13000 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  {.    pBt->nTran
13010 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
13020 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
13030 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
13040 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13050 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
13060 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13070 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65  * Set the handle
13080 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  s current transa
13090 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
130a0 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
130b0 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61  lock.  ** the pa
130c0 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
130d0 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
130e0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
130f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
13100 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
13110 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e  TRANS_NONE;.  un
13120 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
13130 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
13140 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
13150 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13160 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
13170 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13180 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
13190 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
131a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
131b0 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
131c0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
131d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
131e0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
131f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
13200 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
13210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13220 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
13230 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
13240 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20  tPhaseTwo(p);.  
13250 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
13260 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13270 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
13280 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
13290 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
132a0 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72   of write-cursor
132b0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68  s open on this h
132c0 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66  andle. This is f
132d0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
132e0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
132f0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
13300 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
13310 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
13320 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  fined..**.** For
13330 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
13340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
13350 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
13360 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
13370 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
13380 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  f writing to the
13390 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20   databse.  That 
133a0 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72  means the cursor
133b0 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   was.** original
133c0 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  ly opened for wr
133d0 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75  iting and the cu
133e0 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20  rsor has not be 
133f0 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68  disabled.** by h
13400 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20  aving its state 
13410 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f  changed to CURSO
13420 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74  R_FAULT..*/.stat
13430 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
13440 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
13450 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
13460 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
13470 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
13480 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
13490 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
134a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
134b0 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26  ( pCur->wrFlag &
134c0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
134d0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
134e0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
134f0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
13500 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13510 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
13520 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
13530 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
13540 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
13550 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
13560 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74  or on BtShared t
13570 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
13580 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
13590 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
135a0 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
135b0 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ng cursors that 
135c0 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68  belong.** to oth
135d0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
135e0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
135f0 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e  pen to be sharin
13600 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77  g.** the cache w
13610 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
13620 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
13630 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
13640 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
13650 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  s..** All cursor
13660 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  s using the same
13670 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74   cache must be t
13680 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65  ripped.** to pre
13690 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74  vent them from t
136a0 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
136b0 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20   btree after.** 
136c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  the rollback.  T
136d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
136e0 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62  have deleted tab
136f0 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20  les.** or moved 
13700 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69  root pages, so i
13710 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
13720 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74  ent to.** save t
13730 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
13740 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72  cursor.  The cur
13750 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69  sor must be.** i
13760 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76  nvalidated..*/.v
13770 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
13780 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
13790 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
137a0 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74  t errCode){.  Bt
137b0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c  Cursor *p;.  sql
137c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
137d0 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
137e0 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
137f0 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
13800 65 78 74 29 7b 0a 20 20 20 20 63 6c 65 61 72 43  ext){.    clearC
13810 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
13820 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20  ;.    p->eState 
13830 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
13840 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72      p->skip = er
13850 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  rCode;.  }.  sql
13860 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13870 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
13880 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
13890 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
138a0 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
138b0 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
138c0 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
138d0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
138e0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
138f0 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
13900 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
13910 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
13920 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
13930 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
13940 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
13950 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
13960 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
13970 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
13980 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
13990 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
139a0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
139b0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
139c0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
139d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
139e0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b  lback(Btree *p){
139f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
13a00 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
13a10 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
13a20 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
13a30 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13a40 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
13a50 64 62 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41  db;.  rc = saveA
13a60 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
13a70 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
13a80 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
13a90 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
13aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13ab0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
13ac0 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
13ad0 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
13ae0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
13af0 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a  ed whilst.    **
13b00 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
13b10 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73  cursor positions
13b20 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
13b30 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61  automatic rollba
13b40 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68  ck (as.    ** th
13b50 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f  e result of a co
13b60 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63  nstraint, malloc
13b70 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f  () failure or IO
13b80 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20   error) then .  
13b90 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d    ** the cache m
13ba0 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ay be internally
13bb0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e   inconsistent (n
13bc0 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64  ot contain valid
13bd0 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a   trees) so.    *
13be0 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70  * we cannot simp
13bf0 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  ly return the er
13c00 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ror to the calle
13c10 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72  r. Instead, abor
13c20 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75  t .    ** all qu
13c30 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62  eries that may b
13c40 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74  e using any of t
13c50 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
13c60 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a  failed to save..
13c70 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
13c80 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
13c90 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20  rsors(p, rc);.  
13ca0 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
13cb0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
13cc0 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
13cd0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
13ce0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
13cf0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
13d00 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  2;..#ifndef SQLI
13d10 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13d20 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  UM.    pBt->nTru
13d30 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nc = 0;.#endif..
13d40 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
13d50 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
13d60 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
13d70 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13d80 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
13d90 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
13da0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
13db0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
13dc0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
13dd0 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
13de0 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
13df0 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
13e00 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
13e10 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c  .    ** call sql
13e20 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
13e30 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
13e40 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
13e50 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
13e60 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
13e70 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
13e80 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ( sqlite3BtreeGe
13e90 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
13ea0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
13eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
13ec0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
13ed0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
13ee0 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
13ef0 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
13f00 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
13f10 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
13f20 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66  _READ;.  }..  if
13f30 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
13f40 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
13f50 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
13f60 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
13f70 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
13f80 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tion--;.    if( 
13f90 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
13fa0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
13fb0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13fc0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
13fd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69     }.  }..  p->i
13fe0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
13ff0 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74  ONE;.  pBt->inSt
14000 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b  mt = 0;.  unlock
14010 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
14020 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  t);..  btreeInte
14030 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
14040 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14050 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14060 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
14070 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
14080 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73  nsaction.  The s
14090 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
140a0 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  n.** can be roll
140b0 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ed back independ
140c0 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
140d0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  n transaction..*
140e0 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  * You must start
140f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
14100 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
14110 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
14120 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73  .** The subtrans
14130 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
14140 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66  automatically if
14150 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
14160 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73  ction.** commits
14170 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
14180 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73  **.** Only one s
14190 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  ubtransaction ma
141a0 79 20 62 65 20 61 63 74 69 76 65 20 61 74 20 61  y be active at a
141b0 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e   time.  It is an
141c0 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a   error to try.**
141d0 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
141e0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
141f0 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61  f another subtra
14200 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
14210 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a  ady active..**.*
14220 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
14230 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
14240 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
14250 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
14260 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
14270 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
14280 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
14290 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
142a0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
142b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
142c0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
142d0 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
142e0 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
142f0 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
14300 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
14310 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
14320 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
14330 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
14340 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
14350 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
14360 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
14370 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14380 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
14390 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
143a0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
143b0 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54  b;.  if( (p->inT
143c0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
143d0 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d  E) || pBt->inStm
143e0 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42  t ){.    rc = pB
143f0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
14400 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
14410 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14420 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
14430 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
14440 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
14450 54 45 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  TE );.    rc = p
14460 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
14470 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
14480 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
14490 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
144a0 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
144b0 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
144c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
144d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
144e0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
144f0 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72  e statment subtr
14500 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
14510 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
14520 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72    If no.** subtr
14530 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
14540 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ive, this is a n
14550 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
14560 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
14570 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
14580 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
14590 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
145a0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
145b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
145c0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
145d0 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
145e0 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
145f0 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
14600 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
14610 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  mmit(pBt->pPager
14620 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14630 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14640 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d    }.  pBt->inStm
14650 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
14660 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14680 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
14690 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  e active stateme
146a0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
146b0 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61  n.  If no subtra
146c0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  nsaction.** is a
146d0 63 74 69 76 65 20 74 68 69 73 20 72 6f 75 74 69  ctive this routi
146e0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
146f0 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  *.** All cursors
14700 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64   will be invalid
14710 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ated by this ope
14720 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
14730 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61  empt.** to use a
14740 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73   cursor that was
14750 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
14760 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
14770 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  peration.** will
14780 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
14790 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ror..*/.int sqli
147a0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
147b0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
147c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
147d0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
147e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
147f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14800 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
14810 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
14820 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
14830 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
14840 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14850 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62  e3PagerStmtRollb
14860 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
14870 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
14880 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 0;.  }.  sql
14890 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
148a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
148b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
148c0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
148d0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
148e0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
148f0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
14900 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75   The act of acqu
14910 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67  iring a cursor g
14920 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ets a read lock 
14930 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
14940 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
14950 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
14960 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
14970 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
14980 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
14990 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
149a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
149b0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
149c0 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
149d0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
149e0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
149f0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
14a00 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
14a10 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
14a20 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
14a30 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
14a40 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
14a50 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
14a60 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
14a70 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
14a80 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
14a90 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
14aa0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
14ab0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
14ac0 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
14ad0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
14ae0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
14af0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
14b00 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
14b10 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
14b20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
14b30 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
14b40 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
14b50 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
14b60 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
14b70 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
14b80 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
14b90 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
14ba0 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
14bb0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
14bc0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
14bd0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
14be0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
14bf0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
14c00 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
14c10 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
14c20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
14c30 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
14c40 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
14c50 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
14c60 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
14c70 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
14c80 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
14c90 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
14ca0 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
14cb0 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
14cc0 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
14cd0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
14ce0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  k correctly..*/.
14cf0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
14d00 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
14d10 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
14d40 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
14d70 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
14d80 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
14d90 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
14dc0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
14dd0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
14de0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
14df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
14e00 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
14e10 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
14e20 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
14e30 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
14e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
14e50 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
14e60 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  or */.){.  int r
14e70 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
14e80 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
14e90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
14ea0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
14eb0 29 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61  ) );.  if( wrFla
14ec0 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  g ){.    if( pBt
14ed0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
14ee0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14ef0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
14f00 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
14f10 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
14f20 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  le, 0, 0) ){.   
14f30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14f40 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  _LOCKED;.    }. 
14f50 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
14f60 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
14f70 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
14f80 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
14f90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14fa0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
14fb0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
14fc0 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
14fd0 79 20 26 26 20 77 72 46 6c 61 67 20 29 7b 0a 20  y && wrFlag ){. 
14fe0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14ff0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
15000 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
15010 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
15020 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54  iTable;.  if( iT
15030 61 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72  able==1 && pager
15040 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
15050 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
15060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
15070 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  TY;.    goto cre
15080 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
15090 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tion;.  }.  rc =
150a0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
150b0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
150c0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  oot, &pCur->pPag
150d0 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  e, 0);.  if( rc!
150e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
150f0 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
15100 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
15110 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
15120 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
15130 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
15140 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
15150 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
15160 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e  * variables, lin
15170 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
15180 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
15190 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43  ist and set *ppC
151a0 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74  ur (the.  ** out
151b0 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  put argument to 
151c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a  this function)..
151d0 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65    */.  pCur->pKe
151e0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
151f0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
15200 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
15210 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
15220 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67  >wrFlag = wrFlag
15230 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  ;.  pCur->pNext 
15240 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
15250 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
15260 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
15270 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
15280 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70  ur;.  }.  pBt->p
15290 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
152a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
152b0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
152c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
152d0 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72  _OK;..create_cur
152e0 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20  sor_exception:. 
152f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
15300 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c  r->pPage);.  unl
15310 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
15320 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pBt);.  return 
15330 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
15340 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
15350 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15380 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
15390 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
153c0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
153d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
153e0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
15410 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
15420 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
15430 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
15440 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
15450 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
15460 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
15470 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
15480 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
154b0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
154c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
154d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
154e0 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d  ;.  p->pBt->db =
154f0 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62   p->db;.  rc = b
15500 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
15510 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
15520 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
15530 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15540 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
15550 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
15560 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
15570 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a  (){.  return siz
15580 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d  eof(BtCursor);.}
15590 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  ..../*.** Close 
155a0 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
155b0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
155c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
155d0 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
155e0 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
155f0 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
15600 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15610 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
15620 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
15630 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
15640 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
15650 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
15660 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15670 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
15680 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15690 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
156a0 42 74 2d 3e 64 62 20 3d 20 70 42 74 72 65 65 2d  Bt->db = pBtree-
156b0 3e 64 62 3b 0a 20 20 20 20 63 6c 65 61 72 43 75  >db;.    clearCu
156c0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
156d0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r);.    if( pCur
156e0 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
156f0 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
15700 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
15710 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
15720 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
15730 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
15740 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
15750 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
15760 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
15770 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50  pPrev = pCur->pP
15780 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rev;.    }.    r
15790 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
157a0 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 75 6e 6c  >pPage);.    unl
157b0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
157c0 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
157d0 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
157e0 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
157f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
15800 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
15810 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
15820 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
15830 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15840 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  ../*.** Make a t
15850 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
15860 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  by filling in th
15870 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d  e fields of pTem
15880 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d  pCur..** The tem
15890 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73  porary cursor is
158a0 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73   not on the curs
158b0 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  or list for the 
158c0 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Btree..*/.void s
158d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65  qlite3BtreeGetTe
158e0 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
158f0 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f  r *pCur, BtCurso
15900 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20  r *pTempCur){.  
15910 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
15920 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
15930 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70  ;.  memcpy(pTemp
15940 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f  Cur, pCur, sizeo
15950 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65  f(*pCur));.  pTe
15960 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30  mpCur->pNext = 0
15970 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  ;.  pTempCur->pP
15980 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
15990 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29  TempCur->pPage )
159a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
159b0 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
159c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
159d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
159e0 6c 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  lete a temporary
159f0 20 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20   cursor such as 
15a00 77 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  was made by the 
15a10 43 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43  CreateTemporaryC
15a20 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74  ursor().** funct
15a30 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f  ion above..*/.vo
15a40 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  id sqlite3BtreeR
15a50 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
15a60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
15a70 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
15a80 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
15a90 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
15aa0 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73  ->pPage ){.    s
15ab0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
15ac0 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44  (pCur->pPage->pD
15ad0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
15ae0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
15af0 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
15b00 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
15b10 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
15b20 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
15b30 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
15b40 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
15b50 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
15b60 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
15b70 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
15b80 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
15b90 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
15ba0 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
15bb0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
15bc0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
15bd0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
15be0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
15bf0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
15c00 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
15c10 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
15c20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
15c30 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
15c40 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
15c50 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
15c60 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
15c70 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
15c80 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
15c90 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
15ca0 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
15cb0 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
15cc0 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
15cd0 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
15ce0 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
15cf0 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
15d00 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
15d10 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
15d20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
15d30 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
15d40 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
15d50 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
15d60 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
15d70 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
15d80 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
15d90 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
15da0 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
15db0 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
15dc0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
15dd0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
15de0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
15df0 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
15e00 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
15e10 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
15e20 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
15e30 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15e40 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
15e50 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  >pPage, pCur->id
15e60 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  x, &info);.    a
15e70 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69  ssert( memcmp(&i
15e80 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
15e90 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
15ea0 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
15eb0 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
15ec0 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
15ed0 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56  if.#ifdef _MSC_V
15ee0 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65  ER.  /* Use a re
15ef0 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d  al function in M
15f00 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  SVC to work arou
15f10 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20  nd bugs in that 
15f20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73  compiler. */.  s
15f30 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65  tatic void getCe
15f40 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
15f50 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20  *pCur){.    if( 
15f60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
15f70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
15f80 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
15f90 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
15fa0 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72  pCur->idx, &pCur
15fb0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ->info);.      p
15fc0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
15fd0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
15fe0 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49       assertCellI
15ff0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  nfo(pCur);.    }
16000 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  .  }.#else /* if
16010 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f   not _MSC_VER */
16020 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72  .  /* Use a macr
16030 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  o in all other c
16040 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74  ompilers so that
16050 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
16060 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66   inlined */.#def
16070 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ine getCellInfo(
16080 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20  pCur)           
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
160c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
160d0 29 7b 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16100 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16110 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
16120 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
16130 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  , &pCur->info); 
16140 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43          \.    pC
16150 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
16160 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
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 5c 0a 20 20              \.  
161e0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
161f0 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (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 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
16230 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
16240 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
16250 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
16260 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
16270 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
16280 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
16290 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
162a0 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
162b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
162c0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
162d0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
162e0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
162f0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
16300 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
16310 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
16320 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
16330 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
16340 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
16350 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16360 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a   in the key..*/.
16370 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16380 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
16390 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
163a0 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
163b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
163c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
163d0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
163e0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
163f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
16400 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16410 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
16420 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
16430 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
16440 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
16450 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
16460 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16470 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
16480 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
16490 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
164a0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
164b0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
164c0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
164d0 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
164e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
164f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
16500 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
16510 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
16520 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
16530 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
16540 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
16550 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
16560 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
16570 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
16580 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
16590 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
165a0 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
165b0 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
165c0 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
165d0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
165e0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
165f0 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
16600 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
16610 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
16620 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
16630 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
16640 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
16650 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
16660 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
16670 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
16680 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
16690 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
166a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
166b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
166c0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
166d0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
166e0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
166f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
16700 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
16710 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
16720 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
16730 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
16740 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
16750 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
16760 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
16770 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
16780 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
16790 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
167a0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
167b0 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
167c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
167d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
167e0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
167f0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
16800 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
16810 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
16820 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
16830 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
16840 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16850 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
16860 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
16870 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
16880 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
16890 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
168a0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
168b0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
168c0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
168d0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
168e0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
168f0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
16900 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
16910 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
16920 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
16930 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
16940 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70  :.**.** Unless p
16950 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
16960 2c 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  , the page numbe
16970 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
16980 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20  erflow .** page 
16990 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
169a0 73 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  st is written to
169b0 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
169c0 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20  page ovfl.** is 
169d0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
169e0 20 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74   its linked list
169f0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
16a00 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
16a10 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
16a20 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61   not NULL, *ppPa
16a30 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ge is set to the
16a40 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65   MemPage* handle
16a50 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66  .** for page ovf
16a60 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  l. The underlyin
16a70 67 20 70 61 67 65 72 20 70 61 67 65 20 6d 61 79  g pager page may
16a80 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
16a90 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  sted.** with the
16aa0 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
16ab0 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65  set, so the page
16ac0 20 64 61 74 61 20 61 63 63 65 73 73 61 62 6c 65   data accessable
16ad0 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e   via.** this han
16ae0 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74  dle may not be t
16af0 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  rusted..*/.stati
16b00 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
16b10 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
16b20 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20  d *pBt, .  Pgno 
16b30 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
16b40 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66          /* Overf
16b50 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  low page */.  Me
16b60 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
16b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16b80 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
16b90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
16ba0 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
16bb0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
16bc0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
16bd0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
16be0 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69  no next = 0;.  i
16bf0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16c00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16c10 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16c20 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20   );.  /* One of 
16c30 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62  these must not b
16c40 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  e NULL. Otherwis
16c50 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73  e, why call this
16c60 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20   function? */.  
16c70 61 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c  assert(ppPage ||
16c80 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20   pPgnoNext);..  
16c90 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20  /* If pPgnoNext 
16ca0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
16cb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
16cc0 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f  eing called to o
16cd0 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d  btain.  ** a Mem
16ce0 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20  Page* reference 
16cf0 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61  only. No page-da
16d00 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ta is required i
16d10 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
16d20 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65  /.  if( !pPgnoNe
16d30 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  xt ){.    return
16d40 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16d50 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
16d60 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a  ppPage, 1);.  }.
16d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16d80 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
16d90 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
16da0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16db0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
16dc0 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
16dd0 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
16de0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
16df0 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
16e00 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
16e10 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
16e20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
16e30 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
16e40 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
16e50 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
16e60 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
16e70 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
16e80 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
16e90 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
16ea0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
16eb0 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
16ec0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
16ed0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
16ee0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
16ef0 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
16f00 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
16f10 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
16f20 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
16f30 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
16f40 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
16f50 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16f60 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
16f70 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
16f80 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65  if( iGuess<=page
16f90 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
16fa0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
16fb0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
16fc0 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
16fd0 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
16fe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16ff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17010 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54 79   }.      if( eTy
17020 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
17030 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
17040 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
17050 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
17060 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
17070 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 65 78  endif..  if( nex
17080 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 20 29  t==0 || ppPage )
17090 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
170a0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72  Page = 0;..    r
170b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
170c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
170d0 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65 78 74 21  l, &pPage, next!
170e0 3d 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  =0);.    assert(
170f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
17100 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20   pPage==0);.    
17110 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72  if( next==0 && r
17120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17130 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
17140 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
17150 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ta);.    }..    
17160 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
17170 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
17180 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  age;.    }else{.
17190 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
171a0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
171b0 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74    }.  *pPgnoNext
171c0 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75   = next;..  retu
171d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
171e0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
171f0 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
17200 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
17210 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
17220 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
17230 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
17240 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
17250 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
17260 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
17270 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
17280 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
17290 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
172a0 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
172b0 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
172c0 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
172d0 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
172e0 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
172f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
17300 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
17310 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
17320 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
17330 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
17340 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
17350 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
17360 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
17370 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
17380 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
17390 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
173a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
173b0 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
173c0 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
173d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
173e0 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
173f0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
17400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17410 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
17420 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
17430 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
17440 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17450 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
17460 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17480 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
17490 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
174a0 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
174b0 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
174c0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
174d0 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
174e0 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
174f0 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
17500 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
17510 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
17520 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
17530 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
17540 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
17550 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
17560 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17570 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17580 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
17590 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
175a0 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
175b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
175c0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
175d0 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
175e0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
175f0 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
17600 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
17610 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
17620 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17630 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17640 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
17650 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
17660 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
17670 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
17680 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
17690 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
176a0 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
176b0 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
176c0 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
176d0 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
176e0 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
176f0 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
17700 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
17710 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
17720 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
17730 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
17740 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
17750 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
17760 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
17770 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
17780 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
17790 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
177a0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
177b0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
177c0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
177d0 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e  ot make a distin
177e0 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65  ction between ke
177f0 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49  y and data..** I
17800 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20  t just reads or 
17810 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f  writes bytes fro
17820 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  m the payload ar
17830 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20  ea.  Data might 
17840 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68  .** appear on th
17850 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62  e main page or b
17860 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
17870 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
17880 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a  flow .** pages..
17890 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
178a0 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
178b0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
178c0 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
178d0 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
178e0 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
178f0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
17900 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
17910 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
17920 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
17930 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
17940 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
17950 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
17960 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
17970 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
17980 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
17990 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
179a0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
179b0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
179c0 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
179d0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
179e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
179f0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
17a00 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
17a10 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
17a20 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
17a30 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
17a40 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
17a50 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
17a60 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
17a70 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
17a80 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
17a90 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
17aa0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
17ab0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
17ac0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
17ad0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
17ae0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
17af0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
17b00 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
17b10 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
17b20 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
17b30 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
17b40 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
17b50 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
17b60 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
17b70 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
17b80 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
17b90 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
17ba0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
17bb0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
17bc0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
17bd0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
17be0 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  nt offset,      
17bf0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
17c00 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
17c10 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
17c20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
17c30 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
17c40 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
17c50 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
17c60 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
17c70 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
17c80 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
17c90 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20   int skipKey,   
17ca0 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
17cb0 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69  begins at data i
17cc0 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
17cd0 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20  /.  int eOp     
17ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
17cf0 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
17d00 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
17d10 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
17d20 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
17d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17d40 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  OK;.  u32 nKey;.
17d50 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
17d60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
17d70 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20   = pCur->pPage; 
17d80 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61 67      /* Btree pag
17d90 65 20 6f 66 20 63 75 72 72 65 6e 74 20 63 75 72  e of current cur
17da0 73 6f 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  sor entry */.  B
17db0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dd0 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
17de0 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
17df0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
17e00 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
17e10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
17e20 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
17e30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
17e40 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
17e50 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
17e60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
17e70 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  set>=0 );.  asse
17e80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
17e90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
17ea0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
17eb0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
17ec0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
17ed0 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
17ee0 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
17ef0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
17f00 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66 6f  ? 0 : pCur->info
17f10 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73  .nKey);..  if( s
17f20 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66  kipKey ){.    of
17f30 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  fset += nKey;.  
17f40 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61  }.  if( offset+a
17f50 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
17f60 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20  info.nData ){.  
17f70 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
17f80 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
17f90 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
17fa0 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
17fb0 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
17fc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17fd0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
17fe0 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
17ff0 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
18000 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
18010 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
18020 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
18030 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
18040 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
18050 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
18060 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
18070 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
18080 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
18090 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
180a0 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
180b0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
180c0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
180d0 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
180e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
180f0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
18100 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
18110 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
18120 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
18130 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
18140 20 20 7d 0a 0a 20 20 70 42 74 20 3d 20 70 43 75    }..  pBt = pCu
18150 72 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 72 63  r->pBt;.  if( rc
18160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
18170 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
18180 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65 20 3d  t int ovflSize =
18190 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
181a0 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
181b0 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
181c0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
181d0 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
181e0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
181f0 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
18200 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18210 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ]);..#ifndef SQL
18220 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
18230 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
18240 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
18250 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
18260 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
18270 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a  verflow[].    **
18280 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
18290 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
182a0 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72  e it now. The ar
182b0 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a  ray is sized at.
182c0 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79      ** one entry
182d0 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
182e0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  ow page in the o
182f0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
18300 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e  he.    ** page n
18310 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
18320 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
18330 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   is stored in aO
18340 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20  verflow[0],.    
18350 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ** etc. A value 
18360 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
18370 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65  rflow[] array me
18380 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
18390 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20  wn".    ** (the 
183a0 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
183b0 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
183c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
183d0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
183e0 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  e && !pCur->aOve
183f0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69  rflow ){.      i
18400 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
18410 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
18420 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
18430 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
18440 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43  flSize;.      pC
18450 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
18460 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d  (Pgno *)sqlite3M
18470 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
18480 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20  (Pgno)*nOvfl);. 
18490 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26       if( nOvfl &
184a0 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
184b0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
184c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
184d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
184e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
184f0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
18500 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
18510 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
18520 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
18530 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
18540 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
18550 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
18560 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
18570 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
18580 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
18590 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
185a0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
185b0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
185c0 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
185d0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
185e0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
185f0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18600 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
18610 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
18620 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
18630 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
18640 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
18650 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
18660 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
18670 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18680 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
18690 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
186a0 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
186b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
186c0 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
186d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
186e0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
186f0 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
18700 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
18710 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
18720 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
18730 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
18740 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18750 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
18760 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
18770 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
18780 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
18790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
187a0 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
187b0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
187c0 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
187d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
187e0 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
187f0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
18800 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
18810 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
18820 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
18830 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
18840 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
18850 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
18860 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
18870 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
18880 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
18890 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
188a0 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
188b0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
188c0 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
188d0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
188e0 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
188f0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
18900 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
18910 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
18920 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
18930 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
18940 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
18950 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
18960 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
18970 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
18980 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
18990 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
189a0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
189b0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
189c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
189d0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
189e0 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
189f0 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
18a00 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
18a10 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
18a20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
18a30 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
18a40 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
18a50 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
18a60 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20  .        DbPage 
18a70 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
18a80 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
18a90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18aa0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
18ab0 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
18ac0 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  e, &pDbPage);.  
18ad0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18ae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18af0 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
18b00 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
18b10 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
18b20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
18b30 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
18b40 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
18b50 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
18b60 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
18b70 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
18b80 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
18b90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18ba0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
18bb0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
18bc0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
18bd0 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
18be0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
18bf0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
18c00 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
18c10 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
18c20 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d  .          amt -
18c30 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = a;.          p
18c40 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
18c50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18c60 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
18c70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
18c80 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
18c90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18ca0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
18cb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18cc0 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
18cd0 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
18ce0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
18cf0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
18d00 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
18d10 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
18d20 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
18d30 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
18d40 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
18d50 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
18d60 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18d70 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
18d80 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
18d90 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
18da0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
18db0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
18dc0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
18dd0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
18de0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
18df0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18e00 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
18e10 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
18e20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
18e30 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
18e40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
18e50 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
18e60 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
18e70 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
18e80 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
18e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18eb0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18ec0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
18ed0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
18ee0 65 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e!=0 );.    if( 
18ef0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
18f00 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
18f10 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18f20 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
18f30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18f40 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  >pPage->intKey==
18f50 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18f60 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
18f70 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
18f80 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
18f90 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
18fa0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
18fb0 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
18fc0 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
18fd0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
18fe0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18ff0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
19000 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
19010 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
19020 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
19030 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
19040 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
19050 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
19060 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
19070 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
19080 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
19090 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
190a0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
190b0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
190c0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
190d0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
190e0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
190f0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
19100 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
19110 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
19120 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19130 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
19140 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
19150 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
19160 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
19170 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
19180 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
19190 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
191a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
191b0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
191c0 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
191d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
191e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
191f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19200 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
19210 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
19220 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
19230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19240 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
19250 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19260 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
19270 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30  ( pCur->pPage!=0
19280 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19290 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
192a0 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
192b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
192c0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
192d0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
192e0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
192f0 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  1, 0);.  }.  ret
19300 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19310 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
19320 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
19330 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
19340 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
19350 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
19360 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
19370 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
19380 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
19390 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
193a0 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e  if skipKey==0 an
193b0 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  d it points to t
193c0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
193d0 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b  data if.** skipK
193e0 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62  ey==1.  The numb
193f0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
19400 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74  vailable key/dat
19410 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  a is written.** 
19420 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
19430 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
19440 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
19450 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a  d will not be.**
19460 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
19470 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19480 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
19490 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
194a0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
194b0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
194c0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
194d0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
194e0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
194f0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
19500 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
19510 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
19520 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
19530 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
19540 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
19550 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
19560 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
19570 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
19580 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
19590 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
195a0 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
195b0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
195c0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a  d to reassembly.
195d0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
195e0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
195f0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
19600 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
19610 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
19620 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
19630 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
19640 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
19650 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
19660 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
19670 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
19680 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
19690 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
196a0 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
196b0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
196c0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
196d0 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c   char *fetchPayl
196e0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
196f0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
19700 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
19710 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
19720 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
19730 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Amt,           /
19740 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
19750 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
19760 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  bytes here */.  
19770 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20  int skipKey     
19780 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67       /* read beg
19790 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69  inning at data i
197a0 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
197b0 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
197c0 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
197d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
197e0 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
197f0 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61  int nLocal;..  a
19800 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
19810 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30  & pCur->pPage!=0
19820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
19830 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19840 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
19850 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
19860 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19870 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
19880 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
19890 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
198a0 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
198b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74  ->nCell );.  get
198c0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
198d0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
198e0 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20  r->info.pCell;. 
198f0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75   aPayload += pCu
19900 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
19910 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
19920 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
19930 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
19940 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e     nKey = pCur->
19950 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
19960 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
19970 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20      aPayload += 
19980 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c  nKey;.    nLocal
19990 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
199a0 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d  ocal - nKey;.  }
199b0 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c  else{.    nLocal
199c0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
199d0 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c  ocal;.    if( nL
199e0 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20  ocal>nKey ){.   
199f0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79     nLocal = nKey
19a00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
19a10 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
19a20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
19a30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
19a40 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
19a50 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
19a60 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
19a70 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
19a80 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
19a90 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
19aa0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
19ab0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
19ac0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
19ad0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
19ae0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
19af0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
19b00 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
19b10 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
19b20 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
19b30 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
19b40 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
19b50 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
19b60 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
19b70 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
19b80 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
19b90 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
19ba0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
19bb0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
19bc0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
19bd0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
19be0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
19bf0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
19c00 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
19c10 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
19c20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
19c30 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
19c40 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
19c50 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
19c60 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
19c70 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
19c80 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
19c90 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
19ca0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
19cb0 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  mt){.  assert( c
19cc0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19cd0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
19ce0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19cf0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
19d00 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
19d10 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
19d20 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29  d(pCur, pAmt, 0)
19d30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19d40 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
19d50 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
19d60 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
19d70 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
19d80 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
19d90 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19da0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
19db0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19dc0 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
19dd0 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
19de0 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
19df0 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20  Cur, pAmt, 1);. 
19e00 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19e10 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
19e20 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
19e30 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
19e40 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
19e50 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
19e60 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
19e70 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
19e80 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a   to move to..*/.
19e90 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
19ea0 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
19eb0 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
19ec0 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
19ed0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
19ee0 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
19ef0 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61  OldPage;.  BtSha
19f00 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
19f10 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
19f20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19f30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
19f40 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19f50 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19f60 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64  );.  rc = getAnd
19f70 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
19f80 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
19f90 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  , pCur->pPage);.
19fa0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
19fb0 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65  n rc;.  pNewPage
19fc0 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43  ->idxParent = pC
19fd0 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50  ur->idx;.  pOldP
19fe0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
19ff0 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69  e;.  pOldPage->i
1a000 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72  dxShift = 0;.  r
1a010 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50  eleasePage(pOldP
1a020 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
1a030 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  age = pNewPage;.
1a040 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b    pCur->idx = 0;
1a050 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1a060 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1a070 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1a080 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
1a090 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72  nCell<1 ){.    r
1a0a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1a0b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1a0c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a0d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
1a0e0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
1a0f0 61 67 65 20 69 73 20 74 68 65 20 76 69 72 74 75  age is the virtu
1a100 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74  al root of its t
1a110 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
1a120 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
1a130 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  e is the root pa
1a140 67 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c  ge for most tabl
1a150 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20  es.  But.** for 
1a160 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
1a170 20 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65   on page 1, some
1a180 74 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f  time the real ro
1a190 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d  ot page.** is em
1a1a0 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 20 74  pty except for t
1a1b0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
1a1c0 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65 73  .  In such cases
1a1d0 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
1a1e0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68 65  root page is the
1a1f0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 72   page that the r
1a200 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20  ight-pointer of 
1a210 70 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69  page.** 1 is poi
1a220 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74  nting to..*/.int
1a230 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52   sqlite3BtreeIsR
1a240 6f 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  ootPage(MemPage 
1a250 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61  *pPage){.  MemPa
1a260 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20  ge *pParent;..  
1a270 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a280 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1a290 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1a2a0 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
1a2b0 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69  ge->pParent;.  i
1a2c0 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20  f( pParent==0 ) 
1a2d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1a2e0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20  pParent->pgno>1 
1a2f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1a300 28 20 67 65 74 32 62 79 74 65 28 26 70 50 61 72  ( get2byte(&pPar
1a310 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
1a320 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  nt->hdrOffset+3]
1a330 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
1a340 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1a350 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1a360 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
1a370 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
1a380 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
1a390 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
1a3a0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
1a3b0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
1a3c0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
1a3d0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
1a3e0 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
1a3f0 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
1a400 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
1a410 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
1a420 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1a430 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
1a440 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
1a450 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  l index..*/.void
1a460 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1a470 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
1a480 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
1a490 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20  Page *pParent;. 
1a4a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1a4b0 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74  .  int idxParent
1a4c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1a4d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1a4e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1a4f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a500 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1a510 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1a520 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
1a530 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
1a540 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 42 74  sert( !sqlite3Bt
1a550 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
1a560 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65 6e  age) );.  pParen
1a570 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
1a580 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  nt;.  assert( pP
1a590 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 61 73  arent!=0 );.  as
1a5a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
1a5b0 50 61 67 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Page->nRef>0 );.
1a5c0 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70 50    idxParent = pP
1a5d0 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a  age->idxParent;.
1a5e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
1a5f0 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  f(pParent->pDbPa
1a600 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
1a610 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75  ge(pPage);.  pCu
1a620 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72 65  r->pPage = pPare
1a630 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  nt;.  pCur->info
1a640 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1a650 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1a660 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
1a670 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d  rent->idxShift==
1a680 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78  0 );.  pCur->idx
1a690 20 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a   = idxParent;.}.
1a6a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1a6b0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f  cursor to the ro
1a6c0 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69  ot page.*/.stati
1a6d0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
1a6e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1a6f0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
1a700 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
1a710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65  QLITE_OK;.  Btre
1a720 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
1a730 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
1a740 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
1a750 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a760 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1a780 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
1a790 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1a7a0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
1a7b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
1a7c0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1a7d0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
1a7e0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
1a7f0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1a800 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
1a810 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
1a820 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
1a830 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
1a840 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
1a850 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ULT ){.      ret
1a860 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
1a870 20 20 20 20 7d 0a 20 20 20 20 63 6c 65 61 72 43      }.    clearC
1a880 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1a890 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  ur);.  }.  pRoot
1a8a0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1a8b0 20 20 69 66 28 20 70 52 6f 6f 74 20 26 26 20 70    if( pRoot && p
1a8c0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
1a8d0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20  ->pgnoRoot ){.  
1a8e0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1a8f0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c  >isInit );.  }el
1a900 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20  se{.    if( .   
1a910 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
1a920 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1a930 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
1a940 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
1a950 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0)).    ){.     
1a960 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1a970 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1a980 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a990 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
1a9a0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
1a9b0 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ge);.    pCur->p
1a9c0 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20  Page = pRoot;.  
1a9d0 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  }.  pCur->idx = 
1a9e0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
1a9f0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
1aa00 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
1aa10 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1aa20 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f   = 0;.  if( pRoo
1aa30 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
1aa40 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
1aa50 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
1aa60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
1aa70 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20  ot->pgno==1 );. 
1aa80 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
1aa90 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
1aaa0 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
1aab0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
1aac0 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20  sert( subpage>0 
1aad0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
1aae0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
1aaf0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
1ab00 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
1ab10 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  ubpage);.  }.  p
1ab20 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28  Cur->eState = ((
1ab30 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1ab40 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
1ab50 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
1ab60 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  D);.  return rc;
1ab70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1ab80 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1ab90 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
1aba0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
1abb0 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
1abc0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1abd0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1abe0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
1abf0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
1ac00 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
1ac10 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
1ac20 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
1ac30 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1ac40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1ac50 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
1ac60 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1ac70 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
1ac80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ac90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1aca0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1acb0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1acc0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1acd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ace0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1acf0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1ad00 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
1ad10 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
1ad20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
1ad30 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
1ad40 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
1ad50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1ad60 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1ad70 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1ad80 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b  ge, pCur->idx));
1ad90 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1ada0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1adb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1adc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1add0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1ade0 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
1adf0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1ae00 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
1ae10 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
1ae20 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1ae30 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
1ae40 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
1ae50 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
1ae60 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
1ae70 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
1ae80 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1ae90 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
1aea0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
1aeb0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
1aec0 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
1aed0 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
1aee0 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
1aef0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1af00 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
1af10 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
1af20 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
1af30 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
1af40 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
1af50 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
1af60 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1af70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1af80 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
1af90 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1afa0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1afb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1afc0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1afd0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1afe0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1aff0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1b000 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1b010 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1b020 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1b030 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
1b040 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1b050 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
1b060 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1b070 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1b080 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1b090 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78  );.    pCur->idx
1b0a0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1b0b0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1b0c0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1b0d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1b0e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b0f0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
1b100 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a  age->nCell - 1;.
1b110 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1b120 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1b130 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1b140 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1b150 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1b160 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1b170 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1b180 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1b190 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1b1a0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1b1b0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1b1c0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1b1d0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1b1e0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1b1f0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1b200 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1b210 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1b220 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
1b230 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1b240 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1b250 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1b260 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1b270 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1b280 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b290 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1b2a0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1b2b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
1b2c0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
1b2d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b2e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1b2f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1b300 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
1b310 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1b320 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1b330 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1b340 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b350 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1b360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b370 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1b380 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
1b390 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
1b3a0 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
1b3b0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
1b3c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b3d0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1b3e0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
1b3f0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1b400 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1b410 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1b420 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1b430 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1b440 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1b450 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1b460 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1b470 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1b480 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1b490 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b4a0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
1b4b0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1b4c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
1b4d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b4e0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b4f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1b500 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1b510 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1b520 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1b530 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1b540 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1b550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1b560 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1b570 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1b580 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b590 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1b5a0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
1b5b0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
1b5c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1b5d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1b5e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1b5f0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1b600 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
1b610 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1b620 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74 43 65  ur);.      getCe
1b630 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1b640 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
1b650 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   = rc==SQLITE_OK
1b660 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b670 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1b680 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
1b690 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1b6a0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
1b6b0 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
1b6c0 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
1b6d0 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
1b6e0 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
1b6f0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
1b700 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
1b710 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
1b720 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
1b730 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
1b740 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
1b750 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
1b760 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
1b770 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
1b780 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
1b790 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
1b7a0 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
1b7b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
1b7c0 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
1b7d0 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
1b7e0 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
1b7f0 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
1b800 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
1b810 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
1b820 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
1b830 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
1b840 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
1b850 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
1b860 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  y..**.** The res
1b870 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  ult of comparing
1b880 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
1b890 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
1b8a0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69   the.** cursor i
1b8b0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52  s written to *pR
1b8c0 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c  es if pRes!=NULL
1b8d0 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
1b8e0 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20  f.** this value 
1b8f0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
1b900 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
1b910 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
1b920 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1b930 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1b940 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1b950 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
1b960 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69  r than pKey or i
1b970 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1b980 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
1b990 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
1b9a0 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
1b9b0 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
1b9c0 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
1b9d0 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
1b9e0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1b9f0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1ba00 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1ba10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1ba20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
1ba30 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  hes pKey..**.** 
1ba40 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
1ba50 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1ba60 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1ba70 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
1baa0 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74   pKey..**.*/.int
1bab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1bac0 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
1bad0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1bae0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1baf0 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
1bb00 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
1bb10 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
1bb20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
1bb30 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
1bb40 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
1bb50 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1bb60 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
1bb70 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
1bb80 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
1bb90 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
1bba0 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1bbb0 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bbd0 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
1bbe0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1bbf0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1bc00 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1bc10 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1bc20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bc30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1bc40 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1bc50 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
1bc60 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
1bc70 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
1bc80 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
1bc90 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
1bca0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
1bcb0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
1bcc0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
1bcd0 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
1bce0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1bcf0 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75  SOR_VALID && pCu
1bd00 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 26 26 20  r->validNKey && 
1bd10 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
1bd20 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
1bd30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
1bd40 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1bd50 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1bd60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bd70 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
1bd80 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26   pCur->atLast &&
1bd90 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1bda0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
1bdb0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
1bdc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bdd0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1bde0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1bdf0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1be00 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1be10 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1be20 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
1be30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1be40 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
1be50 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1be60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1be70 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
1be80 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
1be90 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1bea0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1beb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bec0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1bed0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
1bee0 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
1bef0 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
1bf00 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1bf10 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1bf20 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1bf30 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1bf40 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1bf50 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1bf60 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1bf70 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1bf80 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1bf90 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1bfa0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1bfb0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1bfc0 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 20  y && pIdxKey==0 
1bfd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1bfe0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1bff0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  T;.      goto mo
1c000 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1c010 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52   }.    if( biasR
1c020 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
1c030 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20  ur->idx = upr;. 
1c040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c050 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72  pCur->idx = (upr
1c060 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +lwr)/2;.    }. 
1c070 20 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20     if( lwr<=upr 
1c080 29 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20  ) for(;;){.     
1c090 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
1c0a0 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c  .      i64 nCell
1c0b0 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  Key;.      pCur-
1c0c0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1c0d0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
1c0e0 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
1c0f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1c100 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Key ){.        u
1c110 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
1c120 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
1c130 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1c140 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
1c150 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
1c160 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
1c170 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
1c180 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
1c190 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
1c1a0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
1c1b0 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  ell, dummy);.   
1c1c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1c1d0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
1c1e0 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
1c1f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
1c200 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
1c210 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1c220 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
1c230 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
1c240 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
1c250 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
1c260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c270 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
1c280 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  Key>intKey );.  
1c290 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
1c2a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c2b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1c2c0 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20  nt available;.  
1c2d0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
1c2e0 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61   (void *)fetchPa
1c2f0 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61  yload(pCur, &ava
1c300 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  ilable, 0);.    
1c310 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70      nCellKey = p
1c320 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1c330 20 20 20 20 20 20 20 20 69 66 28 20 61 76 61 69          if( avai
1c340 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20  lable>=nCellKey 
1c350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1c360 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1c370 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b  rdCompare(nCellK
1c380 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ey, pCellKey, pI
1c390 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
1c3a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c3b0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
1c3c0 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
1c3d0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1c3e0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
1c3f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c400 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1c410 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
1c420 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1c430 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
1c440 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1c450 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
1c460 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
1c470 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65   (void *)pCellKe
1c480 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  y);.          c 
1c490 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1c4a0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
1c4b0 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  Key, pCellKey, p
1c4c0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
1c4d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c4e0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
1c4f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
1c500 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c520 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
1c530 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
1c540 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
1c550 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1c560 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1c570 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
1c580 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1c590 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   lwr = pCur->idx
1c5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  ;.          upr 
1c5b0 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20  = lwr - 1;.     
1c5c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c5d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c5e0 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1c5f0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1c600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c610 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1c620 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1c630 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
1c640 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1c650 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
1c660 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b  r = pCur->idx+1;
1c670 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c680 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72        upr = pCur
1c690 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  ->idx-1;.      }
1c6a0 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
1c6b0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  pr ){.        pC
1c6c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
1c6d0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1c6e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c6f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78  .      pCur->idx
1c700 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
1c710 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c720 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
1c730 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c740 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
1c750 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1c760 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1c770 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1c780 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
1c790 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
1c7a0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1c7b0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c7c0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c7d0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
1c7e0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1c7f0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1c800 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
1c810 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
1c820 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
1c830 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1c840 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1c850 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
1c860 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1c870 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1c880 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
1c890 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c8a0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1c8b0 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
1c8c0 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20  ur->idx = lwr;. 
1c8d0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1c8e0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
1c8f0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1c900 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1c910 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
1c920 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
1c930 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1c940 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74  inish;.  }.movet
1c950 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75  o_finish:.  retu
1c960 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c970 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
1c980 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
1c990 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
1c9a0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
1c9b0 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
1c9c0 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
1c9d0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1c9e0 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
1c9f0 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
1ca00 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
1ca10 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
1ca20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
1ca30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ca40 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
1ca50 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
1ca60 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
1ca70 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
1ca80 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
1ca90 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1caa0 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
1cab0 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
1cac0 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
1cad0 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
1cae0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
1caf0 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
1cb00 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
1cb10 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
1cb20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
1cb30 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
1cb40 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1cb50 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1cb60 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1cb70 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
1cb80 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1cb90 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1cba0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
1cbb0 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
1cbc0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
1cbd0 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
1cbe0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
1cbf0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1cc00 20 61 53 70 61 63 65 5b 31 36 5d 3b 20 2f 2a 20   aSpace[16]; /* 
1cc10 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
1cc20 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
1cc30 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  d a malloc */.. 
1cc40 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1cc50 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
1cc60 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1cc70 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ck(pCur->pKeyInf
1cc80 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  o, nKey, pKey,. 
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
1ccc0 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
1ccd0 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
1cce0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1ccf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
1cd00 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
1cd10 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1cd20 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
1cd30 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
1cd40 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
1cd50 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
1cd60 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
1cd70 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
1cd80 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
1cd90 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
1cda0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1cdb0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1cdc0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1cdd0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1cde0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1cdf0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1ce00 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1ce10 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1ce20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1ce30 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1ce40 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1ce50 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1ce60 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1ce70 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1ce80 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1ce90 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1cea0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1ceb0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1cec0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1ced0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1cee0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1cef0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1cf00 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1cf10 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1cf20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1cf30 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1cf40 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1cf50 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1cf60 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1cf70 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1cf80 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1cf90 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1cfa0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1cfb0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1cfc0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1cfd0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1cfe0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1cff0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d000 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75   handle for a cu
1d010 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rsor..*/.sqlite3
1d020 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   *sqlite3BtreeCu
1d030 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43  rsorDb(const BtC
1d040 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1d050 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d060 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1d070 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1d080 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
1d090 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1d0a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
1d0b0 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
1d0c0 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
1d0d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1d0e0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1d0f0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1d100 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1d110 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1d120 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1d130 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1d140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1d150 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1d160 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1d170 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1d180 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
1d190 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
1d1a0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1d1b0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1d1c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1d1d0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1d1e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d1f0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1d200 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1d210 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1d220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d230 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1d240 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1d250 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61  pRes!=0 );.  pPa
1d260 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1d270 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
1d280 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1d290 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
1d2a0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1d2b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1d2c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1d2d0 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
1d2e0 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1d2f0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1d300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d310 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1d320 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1d330 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1d340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1d350 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
1d360 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
1d370 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  dx++;.  pCur->in
1d380 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1d390 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1d3a0 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
1d3b0 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
1d3c0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
1d3d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1d3e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1d3f0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
1d400 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1d410 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1d420 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
1d430 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d440 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  c;.      rc = mo
1d450 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1d460 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
1d470 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1d480 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1d490 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  do{.      if( sq
1d4a0 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74  lite3BtreeIsRoot
1d4b0 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20  Page(pPage) ){. 
1d4c0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1d4d0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
1d4e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1d4f0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
1d500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d510 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1d520 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1d530 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
1d540 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
1d550 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1d560 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64  }while( pCur->id
1d570 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
1d580 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
1d590 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1d5a0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1d5b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1d5c0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
1d5d0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1d5e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d5f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
1d600 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1d610 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
1d620 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1d630 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d640 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
1d650 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1d660 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
1d670 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
1d680 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
1d690 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
1d6a0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
1d6b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1d6c0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1d6d0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1d6e0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1d6f0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1d700 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1d710 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1d720 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1d730 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
1d740 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1d750 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
1d760 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
1d770 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
1d780 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d790 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1d7a0 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  t rc;.  Pgno pgn
1d7b0 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  o;.  MemPage *pP
1d7c0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1d7d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1d7e0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1d7f0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1d800 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1d810 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d820 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d830 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
1d840 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
1d850 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1d860 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1d870 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1d880 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d890 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1d8a0 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b   pCur->skip<0 ){
1d8b0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1d8c0 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1d8d0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1d8e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d8f0 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1d900 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1d910 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
1d920 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1d930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d940 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69  r->idx>=0 );.  i
1d950 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1d960 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
1d970 74 34 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c  t4byte( findCell
1d980 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
1d990 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  x) );.    rc = m
1d9a0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1d9b0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
1d9c0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1d9d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d9e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1d9f0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
1da00 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1da10 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b   pCur->idx==0 ){
1da20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1da30 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
1da40 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
1da50 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1da60 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1da70 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
1da80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
1da90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1daa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1dab0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1dac0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1dad0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1dae0 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20  ->pPage;.    }. 
1daf0 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a     pCur->idx--;.
1db00 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1db10 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1db20 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1db30 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1db40 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
1db50 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1db60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1db70 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
1db80 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
1db90 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1dba0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1dbb0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
1dbc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dbd0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1dbe0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
1dbf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dc00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
1dc10 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
1dc20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
1dc30 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
1dc40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
1dc50 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
1dc60 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
1dc70 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
1dc80 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
1dc90 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
1dca0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
1dcb0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
1dcc0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1dcd0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
1dce0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1dcf0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
1dd00 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
1dd10 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
1dd20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
1dd30 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
1dd40 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
1dd50 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
1dd60 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
1dd70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
1dd80 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
1dd90 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
1dda0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
1ddb0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
1ddc0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
1ddd0 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
1dde0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1ddf0 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
1de00 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
1de10 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
1de20 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
1de30 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
1de40 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
1de50 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
1de60 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
1de70 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1de80 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
1de90 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
1dea0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
1deb0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
1dec0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ded0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
1dee0 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
1def0 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
1df00 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1df10 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
1df20 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
1df30 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
1df40 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
1df50 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
1df60 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
1df70 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
1df80 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
1df90 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
1dfa0 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
1dfb0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1dfc0 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
1dfd0 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
1dfe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1dff0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
1e000 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1e010 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
1e020 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
1e030 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
1e040 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
1e050 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
1e060 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
1e070 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a  .  int n;     /*
1e080 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e090 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1e0a0 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20   */.  int k;    
1e0b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
1e0c0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
1e0d0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
1e0e0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
1e0f0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
1e100 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
1e110 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  k = 0;..  assert
1e120 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1e130 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1e140 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
1e150 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20  Bt->pPage1;.  n 
1e160 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1e170 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e180 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1e190 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
1e1a0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1e1b0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
1e1c0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
1e1d0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
1e1e0 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
1e1f0 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
1e200 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
1e210 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
1e220 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
1e230 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
1e240 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
1e250 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
1e260 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
1e270 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
1e280 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
1e290 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1e2a0 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
1e2b0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1e2c0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
1e2d0 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
1e2e0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1e2f0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
1e300 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1e310 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e320 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
1e330 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65 72  && nearby<=pager
1e340 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1e350 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1e360 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
1e370 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
1e380 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e390 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1e3a0 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
1e3b0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
1e3c0 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
1e3d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1e3e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e3f0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1e400 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1e410 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1e420 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
1e430 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
1e440 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
1e450 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
1e460 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
1e470 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
1e480 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
1e490 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
1e4a0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
1e4b0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
1e4c0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
1e4d0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
1e4e0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1e4f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e500 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1e510 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e520 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
1e530 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1e540 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
1e550 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
1e560 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
1e570 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
1e580 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
1e590 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
1e5a0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
1e5b0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
1e5c0 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
1e5d0 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
1e5e0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
1e5f0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
1e600 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1e610 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
1e620 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
1e630 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1e640 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
1e650 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
1e660 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1e670 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
1e680 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
1e690 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e6a0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1e6b0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1e6c0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
1e6d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1e6e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1e6f0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
1e700 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
1e710 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1e720 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1e730 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
1e740 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1e750 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
1e760 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
1e770 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
1e780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  );.      if( k==
1e790 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
1e7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1e7b0 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
1e7c0 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
1e7d0 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
1e7e0 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
1e7f0 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
1e800 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
1e810 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
1e820 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
1e830 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
1e840 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
1e850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1e860 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
1e870 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e880 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1e890 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1e8a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1e8b0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1e8c0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1e8d0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1e8e0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1e8f0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
1e900 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1e910 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1e920 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1e930 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1e940 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1e950 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1e960 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1e970 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
1e980 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
1e990 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
1e9a0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
1e9b0 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d  }else if( k>pBt-
1e9c0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
1e9d0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
1e9e0 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
1e9f0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
1ea00 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1ea10 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1ea20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ea30 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
1ea40 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1ea50 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
1ea60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ea70 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
1ea80 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
1ea90 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  && nearby==iTrun
1eaa0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
1eab0 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
1eac0 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
1ead0 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
1eae0 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
1eaf0 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
1eb00 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1eb10 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
1eb20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
1eb30 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1eb40 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e  t( *pPgno==iTrun
1eb50 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  k );.        *pp
1eb60 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
1eb70 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
1eb80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
1eb90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1eba0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1ebb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1ebc0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1ebd0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1ebe0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1ebf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ec00 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
1ec10 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
1ec20 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
1ec30 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1ec40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
1ec50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1ec60 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1ec70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ec80 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
1ec90 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1eca0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1ecb0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1ecc0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1ecd0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1ece0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
1ecf0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1ed00 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
1ed10 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
1ed20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
1ed30 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
1ed40 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
1ed50 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
1ed60 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
1ed70 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1ed80 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1ed90 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
1eda0 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
1edb0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
1edc0 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
1edd0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1ede0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
1edf0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ee00 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
1ee10 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
1ee20 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
1ee30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ee40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ee50 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1ee60 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1ee70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ee80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ee90 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
1eea0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1eeb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1eec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eed0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1eee0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1eef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1ef00 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1ef10 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1ef20 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1ef30 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1ef40 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1ef50 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1ef60 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1ef70 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
1ef80 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1ef90 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1efa0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1efb0 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
1efc0 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
1efd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
1efe0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
1eff0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
1f000 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
1f010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
1f020 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1f030 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
1f040 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1f050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f060 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f070 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
1f080 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1f090 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f0a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1f0b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f0c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f0d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f0e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1f0f0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1f100 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
1f110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1f120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f130 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1f140 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1f150 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
1f160 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
1f170 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
1f180 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
1f190 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f1a0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
1f1b0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
1f1c0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
1f1d0 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  int closest;.   
1f1e0 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
1f1f0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1f200 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
1f210 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
1f220 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f230 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1f240 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1f250 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1f260 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1f270 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1f280 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1f290 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
1f2a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1f2b0 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20  int i, dist;.   
1f2c0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1f2d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
1f2e0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
1f2f0 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
1f300 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
1f310 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
1f320 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
1f330 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
1f340 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1f350 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
1f360 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
1f370 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1f380 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
1f390 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
1f3a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1f3b0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
1f3c0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1f3d0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
1f3e0 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
1f3f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f420 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1f430 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1f440 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
1f450 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1f460 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t*4]);.        i
1f470 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
1f480 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
1f490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1f4a0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   nPage;.        
1f4b0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
1f4c0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61 67  ;.          nPag
1f4d0 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
1f4e0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
1f4f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a  .          if( *
1f500 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29 7b 0a 20  pPgno>nPage ){. 
1f510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
1f520 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20  ee page off the 
1f530 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1f540 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
1f550 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1f560 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1f570 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f580 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f5a0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1f5b0 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
1f5c0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
1f5d0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
1f5e0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
1f5f0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
1f600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f610 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
1f620 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
1f630 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
1f640 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
1f650 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
1f660 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
1f670 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1f680 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
1f690 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1f6a0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
1f6b0 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
1f6c0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1f6d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f6e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
1f6f0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29  Pgno, ppPage, 1)
1f700 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f720 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1f730 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1f740 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d  lback((*ppPage)-
1f750 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1f760 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f770 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1f780 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1f790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1f7a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f7c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1f7d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1f7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f7f0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
1f800 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1f810 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f820 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f830 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1f840 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1f850 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
1f860 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
1f870 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1f880 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
1f890 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
1f8a0 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
1f8b0 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
1f8c0 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
1f8d0 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ile */.    int n
1f8e0 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
1f8f0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1f900 72 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  r);.    *pPgno =
1f910 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 23 69 66   nPage + 1;..#if
1f920 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f930 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1f940 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
1f950 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
1f960 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61  ncr-vacuum has a
1f970 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74 68 69  lready run withi
1f980 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
1f990 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20  on. So the.     
1f9a0 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f   ** page to allo
1f9b0 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d  cate is not from
1f9c0 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e   the physical en
1f9d0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62  d of the file, b
1f9e0 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70  ut.      ** at p
1f9f0 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20  Bt->nTrunc. .   
1fa00 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67     */.      *pPg
1fa10 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  no = pBt->nTrunc
1fa20 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  +1;.      if( *p
1fa30 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
1fa40 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1fa50 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29          (*pPgno)
1fa60 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1fa70 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  }.    if( pBt->a
1fa80 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
1fa90 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1faa0 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
1fab0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
1fac0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
1fad0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
1fae0 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
1faf0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
1fb00 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1fb10 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
1fb20 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
1fb30 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
1fb40 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
1fb50 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
1fb60 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
1fb70 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
1fb80 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
1fb90 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1fba0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1fbb0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
1fbc0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
1fbd0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
1fbe0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1fbf0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1fc00 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
1fc10 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
1fc20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d       if( *pPgno=
1fc30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1fc40 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67  GE(pBt) ){ (*pPg
1fc50 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 20  no)++; }.    }. 
1fc60 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
1fc70 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  nc ){.      pBt-
1fc80 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f  >nTrunc = *pPgno
1fc90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1fca0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1fcb0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1fcc0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1fcd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1fce0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1fcf0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
1fd00 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1fd10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fd20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fd30 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
1fd40 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1fd50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fd60 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1fd70 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1fd80 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
1fd90 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1fda0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
1fdb0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1fdc0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
1fdd0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1fde0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1fdf0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
1fe00 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
1fe10 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
1fe20 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1fe30 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
1fe40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
1fe50 61 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  a page of the da
1fe60 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74  tabase file to t
1fe70 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
1fe80 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1fe90 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63 61  nref() is NOT ca
1fea0 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e 0a  lled for pPage..
1feb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
1fec0 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
1fed0 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  pPage){.  BtShar
1fee0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1fef0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1ff00 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1ff10 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c  Page1;.  int rc,
1ff20 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65   n, k;..  /* Pre
1ff30 70 61 72 65 20 74 68 65 20 70 61 67 65 20 66 6f  pare the page fo
1ff40 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61  r freeing */.  a
1ff50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1ff60 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1ff70 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1ff80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1ff90 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61  >pgno>1 );.  pPa
1ffa0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
1ffb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1ffc0 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
1ffd0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
1ffe0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  = 0;..  /* Incre
1fff0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
20000 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
20010 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
20020 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20030 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
20040 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
20050 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74  rn rc;.  n = get
20060 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
20070 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
20080 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
20090 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a  Data[36], n+1);.
200a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
200b0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
200c0 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
200d0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
200e0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
200f0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
20100 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
20110 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
20120 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
20130 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
20140 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
20150 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
20160 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
20170 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20180 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  rc;.  memset(pPa
20190 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
201a0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
201b0 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
201c0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
201d0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
201e0 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
201f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
20200 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
20210 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
20220 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
20230 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
20240 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
20250 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
20260 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  pBt, pPage->pgno
20270 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
20280 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
20290 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
202a0 20 7d 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29   }..  if( n==0 )
202b0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
202c0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
202d0 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  page */.    rc =
202e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
202f0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
20300 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
20310 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20320 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
20330 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ata, 0, 8);.    
20340 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
20350 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
20360 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54  ge->pgno);.    T
20370 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
20380 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70  : %d first\n", p
20390 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
203a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74  }else{.    /* Ot
203b0 68 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61  her free pages a
203c0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52  lready exist.  R
203d0 65 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74  etrive the first
203e0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
203f0 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ** of the freeli
20400 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20  st and find out 
20410 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20  how many leaves 
20420 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d  it has. */.    M
20430 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a  emPage *pTrunk;.
20440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20450 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
20460 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
20470 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20  e1->aData[32]), 
20480 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
20490 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
204a0 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74   rc;.    k = get
204b0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
204c0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66  Data[4]);.    if
204d0 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ( k>=pBt->usable
204e0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
204f0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
20500 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20   is full.  Turn 
20510 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
20520 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a  reed into a new.
20530 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70        ** trunk p
20540 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76  age with no leav
20550 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
20560 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
20570 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
20580 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
20590 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
205a0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
205b0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
205c0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
205d0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
205e0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
205f0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
20600 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
20610 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
20620 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
20630 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
20640 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
20650 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
20660 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
20670 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
20680 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
20690 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
206a0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
206b0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
206c0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
206d0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
206e0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
206f0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
20700 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
20710 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
20720 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20  will contain to 
20730 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
20740 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
20750 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
20760 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
20770 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
20780 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
20790 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
207a0 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
207b0 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
207c0 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
207d0 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
207e0 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
207f0 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
20800 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
20810 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
20820 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
20830 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
20840 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
20850 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20860 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
20870 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20890 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
208a0 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b  e->aData, pTrunk
208b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
208c0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
208d0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
208e0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
208f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
20900 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
20910 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
20920 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
20930 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
20940 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
20950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20960 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54   pPage->pgno, pT
20970 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
20980 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
20990 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20 20 20  if( k<0 ){.     
209a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
209b0 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RUPT;.    }else{
209c0 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  .      /* Add th
209d0 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61  e newly freed pa
209e0 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20  ge as a leaf on 
209f0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e  the current trun
20a00 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
20a10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20a20 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
20a30 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
20a40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20a50 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
20a60 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
20a70 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20  ], k+1);.       
20a80 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
20a90 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c  k->aData[8+k*4],
20aa0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23   pPage->pgno);.#
20ab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45  ifndef SQLITE_SE
20ac0 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
20ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20ae0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
20af0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
20b00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
20b10 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
20b20 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
20b30 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
20b40 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
20b50 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
20b60 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
20b70 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
20b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20b90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
20ba0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
20bb0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20bc0 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
20bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
20be0 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
20bf0 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
20c00 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
20c10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20c20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
20c30 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
20c40 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
20c50 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
20c60 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66  nOvfl;.  int ovf
20c70 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
20c80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20c90 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
20ca0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
20cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
20cc0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
20cd0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
20ce0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
20cf0 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
20d00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20d10 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
20d20 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
20d30 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
20d40 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
20d50 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
20d60 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
20d70 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76  Overflow]);.  ov
20d80 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
20d90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
20da0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
20db0 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
20dc0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
20dd0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
20de0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
20df0 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
20e00 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
20e10 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
20e20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
20e30 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f  pOvfl;.    if( o
20e40 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76  vflPgno==0 || ov
20e50 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  flPgno>pagerPage
20e60 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
20e70 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
20e80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20e90 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
20ea0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
20eb0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
20ec0 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28  lPgno, &pOvfl, (
20ed0 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66  nOvfl==0)?0:&ovf
20ee0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
20ef0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20f00 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
20f10 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
20f20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20f30 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
20f40 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
20f50 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
20f60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
20f80 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
20f90 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
20fa0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
20fb0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
20fc0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
20fd0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
20fe0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
20ff0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
21000 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
21010 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
21020 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
21030 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
21040 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
21050 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
21060 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
21070 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
21080 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
21090 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
210a0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
210b0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
210c0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
210d0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
210e0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
210f0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
21100 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
21110 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
21120 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
21130 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
21140 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
21150 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
21160 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
21170 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
21180 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
21190 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
211b0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
211c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
211d0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
211e0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
211f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
21200 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
21210 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
21220 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
21230 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
21240 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
21250 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
21260 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
21270 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
21280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21290 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
212a0 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
212b0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
212c0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
212f0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
21300 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
21310 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
21320 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
21330 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
21340 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
21350 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
21360 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
21370 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
21380 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
21390 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
213a0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
213b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
213c0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
213d0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
213e0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
213f0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
21400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21410 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
21420 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
21430 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
21440 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
21450 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
21460 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
21470 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
21480 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
21490 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
214a0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
214b0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
214c0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
214d0 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
214e0 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
214f0 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
21500 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
21510 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
21520 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
21530 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  y);.  sqlite3Btr
21540 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
21550 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
21560 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
21570 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
21580 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
21590 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
215a0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
215b0 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61  nfo.nData==nData
215c0 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f  +nZero );.  .  /
215d0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
215e0 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
215f0 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
21600 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
21610 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
21620 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
21630 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
21640 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
21650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
21660 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
21670 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
21680 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a     nSrc = nKey;.
21690 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
216a0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
216b0 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
216c0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
216d0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
216e0 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
216f0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
21700 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
21710 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
21720 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
21730 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t==0 ){.      in
21740 74 20 69 73 45 78 61 63 74 20 3d 20 30 3b 0a 23  t isExact = 0;.#
21750 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21760 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21770 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
21780 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
21790 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
217a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
217b0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
217c0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
217d0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
217e0 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
217f0 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
21800 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
21810 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
21820 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
21830 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
21840 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
21850 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
21860 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
21870 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20  gnoOvfl>1 ){.   
21880 20 20 20 20 20 20 20 2f 2a 20 69 73 45 78 61 63         /* isExac
21890 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20  t = 1; */.      
218a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
218b0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
218c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
218d0 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
218e0 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
218f0 2c 20 69 73 45 78 61 63 74 29 3b 0a 23 69 66 6e  , isExact);.#ifn
21900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21910 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
21920 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
21930 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
21940 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
21950 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
21960 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
21970 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
21980 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
21990 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
219a0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
219b0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
219c0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
219d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
219e0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
219f0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
21a00 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
21a10 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
21a20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
21a30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
21a40 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
21a50 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
21a60 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
21a70 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
21a80 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
21a90 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
21aa0 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
21ab0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
21ac0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
21ad0 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
21ae0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
21af0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
21b00 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
21b10 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
21b20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
21b30 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
21b40 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
21b50 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
21b60 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
21b70 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
21b80 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
21b90 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OW1);.        rc
21ba0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
21bb0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
21bc0 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  e, pgnoPtrmap);.
21bd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
21be0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
21bf0 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
21c00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21c10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
21c20 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
21c30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
21c40 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
21c50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21c60 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
21c70 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
21c80 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
21c90 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
21ca0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
21cb0 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
21cc0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
21cd0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
21ce0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
21cf0 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
21d00 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
21d10 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
21d20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
21d30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
21d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
21d50 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
21d60 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
21d70 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  n = spaceLeft;. 
21d80 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
21d90 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
21da0 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
21db0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
21dc0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
21dd0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
21de0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
21df0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
21e00 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
21e10 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
21e20 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
21e30 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
21e40 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
21e50 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
21e60 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
21e70 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
21e80 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
21e90 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
21ea0 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
21eb0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
21ec0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
21ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21ee0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  }.../*.** Change
21ef0 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61   the MemPage.pPa
21f00 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20  rent pointer on 
21f10 74 68 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e  the page whose n
21f20 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65  umber is.** give
21f30 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  n in the second 
21f40 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74  argument so that
21f50 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74   MemPage.pParent
21f60 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f   holds the.** po
21f70 69 6e 74 65 72 20 69 6e 20 74 68 65 20 74 68 69  inter in the thi
21f80 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  rd argument..**.
21f90 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20  ** If the final 
21fa0 61 72 67 75 6d 65 6e 74 2c 20 75 70 64 61 74 65  argument, update
21fb0 50 74 72 6d 61 70 2c 20 69 73 20 6e 6f 6e 2d 7a  Ptrmap, is non-z
21fc0 65 72 6f 20 61 6e 64 20 74 68 65 20 64 61 74 61  ero and the data
21fd0 62 61 73 65 0a 2a 2a 20 69 73 20 61 6e 20 61 75  base.** is an au
21fe0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
21ff0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  se, then the poi
22000 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
22010 6f 72 20 70 67 6e 6f 0a 2a 2a 20 69 73 20 75 70  or pgno.** is up
22020 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
22030 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67   int reparentPag
22040 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
22050 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
22060 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 73 74 72     /* B-Tree str
22070 75 63 74 75 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  ucture */.  Pgno
22080 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
22090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
220a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c  e number of chil
220b0 64 20 62 65 69 6e 67 20 61 64 6f 70 74 65 64 20  d being adopted 
220c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  */.  MemPage *pN
220d0 65 77 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  ewParent,       
220e0 20 20 20 2f 2a 20 4e 65 77 20 70 61 72 65 6e 74     /* New parent
220f0 20 6f 66 20 70 67 6e 6f 20 2a 2f 0a 20 20 69 6e   of pgno */.  in
22100 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
22110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22120 6e 64 65 78 20 6f 66 20 63 68 69 6c 64 20 70 61  ndex of child pa
22130 67 65 20 70 67 6e 6f 20 69 6e 20 70 4e 65 77 50  ge pgno in pNewP
22140 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 75  arent */.  int u
22150 70 64 61 74 65 50 74 72 6d 61 70 20 20 20 20 20  pdatePtrmap     
22160 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
22170 72 75 65 2c 20 75 70 64 61 74 65 20 70 6f 69 6e  rue, update poin
22180 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 67 6e 6f  ter-map for pgno
22190 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
221a0 20 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67   *pThis;.  DbPag
221b0 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
221c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
221d0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
221e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
221f0 74 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d 30  t( pNewParent!=0
22200 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   );.  if( pgno==
22210 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
22220 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
22230 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
22240 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
22250 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
22260 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
22270 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
22280 67 65 20 29 7b 0a 20 20 20 20 70 54 68 69 73 20  ge ){.    pThis 
22290 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
222a0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
222b0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
222c0 69 66 28 20 70 54 68 69 73 2d 3e 69 73 49 6e 69  if( pThis->isIni
222d0 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
222e0 74 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61 3d  t( pThis->aData=
222f0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
22300 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
22310 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73  .      if( pThis
22320 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50  ->pParent!=pNewP
22330 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  arent ){.       
22340 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72   if( pThis->pPar
22350 65 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61 67  ent ) sqlite3Pag
22360 65 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70  erUnref(pThis->p
22370 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
22380 3b 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d  ;.        pThis-
22390 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50  >pParent = pNewP
223a0 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73  arent;.        s
223b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
223c0 4e 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  NewParent->pDbPa
223d0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
223e0 20 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72     pThis->idxPar
223f0 65 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d  ent = idx;.    }
22400 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
22410 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
22420 0a 20 20 7d 0a 0a 20 20 69 66 28 20 49 53 41 55  .  }..  if( ISAU
22430 54 4f 56 41 43 55 55 4d 20 26 26 20 75 70 64 61  TOVACUUM && upda
22440 74 65 50 74 72 6d 61 70 20 29 7b 0a 20 20 20 20  tePtrmap ){.    
22450 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
22460 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  (pBt, pgno, PTRM
22470 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61  AP_BTREE, pNewPa
22480 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  rent->pgno);.  }
22490 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
224a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 70 64  .  /* If the upd
224b0 61 74 65 50 74 72 6d 61 70 20 66 6c 61 67 20 77  atePtrmap flag w
224c0 61 73 20 63 6c 65 61 72 2c 20 61 73 73 65 72 74  as clear, assert
224d0 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
224e0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 6f 69 6e  in the.  ** poin
224f0 74 65 72 2d 6d 61 70 20 69 73 20 61 6c 72 65 61  ter-map is alrea
22500 64 79 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  dy correct..  */
22510 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
22520 55 55 4d 20 29 7b 0a 20 20 20 20 70 44 62 50 61  UUM ){.    pDbPa
22530 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
22540 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
22550 67 65 72 2c 50 54 52 4d 41 50 5f 50 41 47 45 4e  ger,PTRMAP_PAGEN
22560 4f 28 70 42 74 2c 70 67 6e 6f 29 29 3b 0a 20 20  O(pBt,pgno));.  
22570 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
22580 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
22590 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 69 3b 0a  .      Pgno ii;.
225a0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 70        int rc = p
225b0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67  trmapGet(pBt, pg
225c0 6e 6f 2c 20 26 65 54 79 70 65 2c 20 26 69 69 29  no, &eType, &ii)
225d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
225e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
225f0 20 69 69 3d 3d 70 4e 65 77 50 61 72 65 6e 74 2d   ii==pNewParent-
22600 3e 70 67 6e 6f 20 26 26 20 65 54 79 70 65 3d 3d  >pgno && eType==
22610 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
22620 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
22630 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
22640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
22650 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
22660 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
22670 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50  ** Change the pP
22680 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66  arent pointer of
22690 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
226a0 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20   pPage to point 
226b0 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65  back.** to pPage
226c0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
226d0 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72   words, for ever
226e0 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65  y child of pPage
226f0 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e  , invoke reparen
22700 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61  tPage().** to ma
22710 6b 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63  ke sure that eac
22720 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68  h child knows th
22730 61 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20  at pPage is its 
22740 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  parent..**.** Th
22750 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
22760 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75  called after you
22770 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61   memcpy() one pa
22780 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68  ge into.** anoth
22790 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 70 64  er..**.** If upd
227a0 61 74 65 50 74 72 6d 61 70 20 69 73 20 74 72 75  atePtrmap is tru
227b0 65 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e  e, then the poin
227c0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
227d0 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 0a 2a 2a  for all child.**
227e0 20 70 61 67 65 73 20 6f 66 20 70 50 61 67 65 20   pages of pPage 
227f0 61 72 65 20 75 70 64 61 74 65 64 2e 0a 2a 2f 0a  are updated..*/.
22800 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72  static int repar
22810 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d 65  entChildPages(Me
22820 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
22830 74 20 75 70 64 61 74 65 50 74 72 6d 61 70 29 7b  t updatePtrmap){
22840 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22850 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
22860 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22870 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
22880 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
22890 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
228a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
228b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
228c0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 50  Page->pBt;.    P
228d0 67 6e 6f 20 69 52 69 67 68 74 20 3d 20 67 65 74  gno iRight = get
228e0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
228f0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
22900 66 73 65 74 2b 38 5d 29 3b 0a 0a 20 20 20 20 66  fset+8]);..    f
22910 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
22920 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
22930 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
22940 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
22950 69 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  i);.      rc = r
22960 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
22970 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
22980 2c 20 70 50 61 67 65 2c 20 69 2c 20 75 70 64 61  , pPage, i, upda
22990 74 65 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20  tePtrmap);.     
229a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
229b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
229c0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72      }.    rc = r
229d0 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
229e0 20 69 52 69 67 68 74 2c 20 70 50 61 67 65 2c 20   iRight, pPage, 
229f0 69 2c 20 75 70 64 61 74 65 50 74 72 6d 61 70 29  i, updatePtrmap)
22a00 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78  ;.    pPage->idx
22a10 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  Shift = 0;.  }. 
22a20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22a30 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
22a40 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
22a50 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
22a60 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
22a70 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
22a80 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
22a90 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
22aa0 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
22ab0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
22ac0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
22ad0 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
22ae0 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
22af0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
22b00 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
22b10 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
22b20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
22b30 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
22b40 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
22b50 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
22b60 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
22b70 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
22b80 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
22b90 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
22ba0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
22bb0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22bc0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
22bd0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
22be0 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
22bf0 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
22c00 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
22c10 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
22c20 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
22c30 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
22c40 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
22c50 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
22c60 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
22c70 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  /..  assert( idx
22c80 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
22c90 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
22ca0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
22cb0 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
22cc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22cd0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
22ce0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
22cf0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
22d00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
22d10 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
22d20 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
22d30 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
22d40 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50    ptr = &data[pP
22d50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
22d60 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  + 2*idx];.  pc =
22d70 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
22d80 20 20 61 73 73 65 72 74 28 20 70 63 3e 31 30 20    assert( pc>10 
22d90 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d  && pc+sz<=pPage-
22da0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
22db0 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28   );.  freeSpace(
22dc0 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
22dd0 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69    for(i=idx+1; i
22de0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
22df0 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20  ++, ptr+=2){.   
22e00 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d   ptr[0] = ptr[2]
22e10 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70  ;.    ptr[1] = p
22e20 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  tr[3];.  }.  pPa
22e30 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70  ge->nCell--;.  p
22e40 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  ut2byte(&data[pP
22e50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
22e60 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
22e70 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
22e80 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e   += 2;.  pPage->
22e90 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a  idxShift = 1;.}.
22ea0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
22eb0 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
22ec0 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
22ed0 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
22ee0 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
22ef0 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
22f00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
22f10 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
22f20 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
22f30 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
22f40 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
22f50 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
22f60 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
22f70 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
22f80 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
22f90 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
22fa0 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
22fb0 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
22fc0 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
22fd0 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f  .** in pPage->aO
22fe0 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
22ff0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
23000 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
23010 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
23020 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
23030 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
23040 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
23050 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
23060 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
23070 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
23080 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
23090 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
230a0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
230b0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
230c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
230d0 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
230e0 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
230f0 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
23100 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
23110 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
23120 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
23130 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
23140 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
23150 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
23160 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
23170 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
23180 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
23190 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
231a0 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
231b0 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
231c0 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28   int insertCell(
231d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
231e0 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
231f0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
23200 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
23210 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
23220 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
23230 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
23240 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
23250 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
23260 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
23270 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
23280 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
23290 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
232a0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
232b0 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
232c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
232d0 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
232e0 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
232f0 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69  ded */.  u8 nSki
23300 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  p          /* Do
23310 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 66   not write the f
23320 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73  irst nSkip bytes
23330 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
23340 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  ){.  int idx;   
23350 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
23360 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
23370 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
23380 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
23390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
233a0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
233b0 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
233c0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
233d0 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  of content for a
233e0 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b  ny cell in data[
233f0 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  ] */.  int end; 
23400 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23410 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
23420 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
23430 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
23440 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
23450 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
23460 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
23470 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
23480 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
23490 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
234a0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64  /* Offset into d
234b0 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67  ata[] of the pag
234c0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
234d0 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
234e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
234f0 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
23500 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
23510 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
23520 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
23530 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
23540 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
23550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
23560 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
23570 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
23580 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
23590 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
235a0 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
235b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
235c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
235d0 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
235e0 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20  age, pCell) );. 
235f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23600 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
23610 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
23620 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
23630 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
23640 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
23650 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
23660 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
23670 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
23680 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
23690 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
236a0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
236b0 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
236c0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
236d0 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28  ssert( j<sizeof(
236e0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
236f0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
23700 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61  l[0]) );.    pPa
23710 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65  ge->aOvfl[j].pCe
23720 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ll = pCell;.    
23730 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
23740 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61  idx = i;.    pPa
23750 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ge->nFree = 0;. 
23760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
23770 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23780 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
23790 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
237a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
237b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
237c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
237d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
237e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
237f0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
23800 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
23810 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20  >aData;.    hdr 
23820 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
23830 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  et;.    top = ge
23840 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
23850 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  +5]);.    cellOf
23860 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
23870 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
23880 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
23890 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   2*pPage->nCell 
238a0 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  + 2;.    ins = c
238b0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
238c0 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74  .    if( end > t
238d0 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20  op - sz ){.     
238e0 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
238f0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 6f  pPage);.      to
23900 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
23910 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
23920 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20    assert( end + 
23930 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20  sz <= top );.   
23940 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c   }.    idx = all
23950 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
23960 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72  , sz);.    asser
23970 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20  t( idx>0 );.    
23980 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67  assert( end <= g
23990 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
239a0 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61  r+5]) );.    pPa
239b0 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
239c0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
239d0 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   2;.    memcpy(&
239e0 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
239f0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
23a00 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72  -nSkip);.    for
23a10 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64  (j=end-2, ptr=&d
23a20 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
23a30 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
23a40 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
23a50 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
23a60 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
23a70 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
23a80 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
23a90 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
23aa0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
23ab0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
23ac0 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
23ad0 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
23ae0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
23af0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
23b00 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
23b10 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
23b20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
23b30 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
23b40 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
23b50 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
23b60 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
23b70 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
23b80 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
23b90 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
23ba0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
23bb0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
23bc0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
23bd0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
23be0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
23bf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23c00 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
23c10 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
23c20 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
23c30 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
23c40 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
23c50 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
23c60 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
23c70 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
23c80 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
23c90 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
23ca0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
23cb0 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
23cc0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
23cd0 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f  Page->pBt, pgnoO
23ce0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
23cf0 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
23d00 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
23d10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23d20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23d30 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
23d40 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
23d50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
23d60 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
23d70 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
23d80 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
23d90 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
23da0 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
23db0 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
23dc0 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
23dd0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
23de0 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
23df0 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
23e00 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
23e10 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
23e20 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
23e30 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
23e40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
23e50 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
23e60 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
23e70 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
23e80 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
23e90 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
23ea0 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
23eb0 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
23ec0 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
23ed0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
23ee0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
23ef0 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69  */.  int totalSi
23f00 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  ze;    /* Total 
23f10 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
23f20 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  s */.  int hdr; 
23f30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
23f40 78 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  x of page header
23f50 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74   */.  int cellpt
23f60 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  r;      /* Addre
23f70 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
23f80 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
23f90 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f   cellbody;     /
23fa0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
23fb0 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20  t cell body */. 
23fc0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
23fd0 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
23fe0 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  he page */..  as
23ff0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
24000 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
24010 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24020 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
24030 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
24040 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b    totalSize = 0;
24050 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
24060 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74  ell; i++){.    t
24070 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a  otalSize += aSiz
24080 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  e[i];.  }.  asse
24090 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a  rt( totalSize+2*
240a0 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46  nCell<=pPage->nF
240b0 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ree );.  assert(
240c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
240d0 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20   );.  cellptr = 
240e0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
240f0 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  t;.  data = pPag
24100 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
24110 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
24120 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  et;.  put2byte(&
24130 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
24140 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ll);.  if( nCell
24150 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   ){.    cellbody
24160 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
24170 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a  (pPage, totalSiz
24180 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
24190 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20  cellbody>0 );.  
241a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
241b0 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c  >nFree >= 2*nCel
241c0 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l );.    pPage->
241d0 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c  nFree -= 2*nCell
241e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
241f0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
24200 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
24210 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c  ta[cellptr], cel
24220 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65  lbody);.      me
24230 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
24240 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
24250 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20   aSize[i]);.    
24260 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a    cellptr += 2;.
24270 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b        cellbody +
24280 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
24290 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  }.    assert( ce
242a0 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70  llbody==pPage->p
242b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
242c0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
242d0 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a  Cell = nCell;.}.
242e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
242f0 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
24300 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
24310 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
24320 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
24330 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
24340 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
24350 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
24360 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
24370 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
24380 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
24390 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
243a0 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
243b0 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
243c0 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
243d0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
243e0 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
243f0 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
24400 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
24410 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
24420 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
24430 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
24440 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
24450 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
24460 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
24470 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
24480 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
24490 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
244a0 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
244b0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
244c0 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
244d0 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
244e0 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
244f0 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
24500 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
24510 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
24520 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
24530 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
24540 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
24550 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
24560 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
24570 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
24580 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
24590 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
245a0 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
245b0 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
245c0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
245d0 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
245e0 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
245f0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
24600 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a  MemPage*, int);.
24610 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24620 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
24630 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
24640 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
24650 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
24660 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
24670 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
24680 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
24690 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
246a0 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
246b0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
246c0 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
246d0 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
246e0 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
246f0 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
24700 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
24710 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
24720 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e   of trying balan
24730 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
24740 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
24750 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
24760 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
24770 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
24780 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
24790 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
247a0 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
247b0 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
247c0 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
247d0 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
247e0 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
247f0 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
24800 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
24810 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
24820 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
24830 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
24840 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
24850 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
24860 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
24870 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
24880 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
24890 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
248a0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
248b0 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
248c0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
248d0 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
248e0 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
248f0 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
24900 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
24910 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
24920 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
24930 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
24940 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
24950 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ck(MemPage *pPag
24960 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  e, MemPage *pPar
24970 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
24980 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
24990 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
249a0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
249b0 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65  u16 szCell;.  Ce
249c0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42  llInfo info;.  B
249d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
249e0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
249f0 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61   parentIdx = pPa
24a00 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f  rent->nCell;   /
24a10 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69  * pParent new di
24a20 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78  vider cell index
24a30 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
24a40 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
24a50 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
24a60 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  of new divider c
24a70 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65  ell */.  u8 pare
24a80 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20  ntCell[64];     
24a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
24aa0 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
24ab0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
24ac0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24ad0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
24ae0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
24af0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
24b00 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  te a new page. I
24b10 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c  nsert the overfl
24b20 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
24b30 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e  ge.  ** into it.
24b40 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   Then remove the
24b50 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
24b60 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a  rom pPage..  */.
24b70 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
24b80 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
24b90 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
24ba0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
24bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24bd0 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
24be0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
24bf0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  .  szCell = cell
24c00 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
24c10 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67  Cell);.  zeroPag
24c20 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61  e(pNew, pPage->a
24c30 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65  Data[0]);.  asse
24c40 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
24c50 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
24c60 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  l);.  pPage->nOv
24c70 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f  erflow = 0;..  /
24c80 2a 20 53 65 74 20 74 68 65 20 70 61 72 65 6e 74  * Set the parent
24c90 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c   of the newly al
24ca0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f 20  located page to 
24cb0 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e  pParent. */.  pN
24cc0 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ew->pParent = pP
24cd0 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  arent;.  sqlite3
24ce0 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74  PagerRef(pParent
24cf0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  ->pDbPage);..  /
24d00 2a 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65  * pPage is curre
24d10 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63  ntly the right-c
24d20 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e  hild of pParent.
24d30 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a   Change this.  *
24d40 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 69  * so that the ri
24d50 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65  ght-child is the
24d60 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61   new page alloca
24d70 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20  ted above and.  
24d80 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
24d90 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
24da0 69 6c 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ild. .  **.  ** 
24db0 49 67 6e 6f 72 65 20 74 68 65 20 72 65 74 75 72  Ignore the retur
24dc0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  n value of the c
24dd0 61 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c  all to fillInCel
24de0 6c 28 29 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  l(). fillInCell(
24df0 29 0a 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20  ).  ** may only 
24e00 72 65 74 75 72 6e 20 6f 74 68 65 72 20 74 68 61  return other tha
24e10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69  n SQLITE_OK if i
24e20 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  t is required to
24e30 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 6f   allocate.  ** o
24e40 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
24e50 6c 6f 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65  low pages. Since
24e60 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62   an internal tab
24e70 6c 65 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a  le B-Tree cell .
24e80 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72 20 73    ** may never s
24e90 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f 20 61  pill over onto a
24ea0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
24eb0 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d 75 6d  (it is a maximum
24ec0 20 6f 66 20 0a 20 20 2a 2a 20 31 33 20 62 79 74   of .  ** 13 byt
24ed0 65 73 20 69 6e 20 73 69 7a 65 29 2c 20 69 74 20  es in size), it 
24ee0 69 73 20 6e 6f 74 20 6e 65 63 63 65 73 73 61 72  is not neccessar
24ef0 79 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 72  y to check the r
24f00 65 74 75 72 6e 20 63 6f 64 65 2e 0a 20 20 2a 2a  eturn code..  **
24f10 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c  .  ** Similarly,
24f20 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
24f30 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  ) function canno
24f40 74 20 66 61 69 6c 20 69 66 20 74 68 65 20 70 61  t fail if the pa
24f50 67 65 0a 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e  ge.  ** being in
24f60 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73 20 61  serted into is a
24f70 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c 65 20  lready writable 
24f80 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64 6f 65  and the cell doe
24f90 73 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 6f 6e 74  s not .  ** cont
24fa0 61 69 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ain an overflow 
24fb0 70 6f 69 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f  pointer. So igno
24fc0 72 65 20 74 68 69 73 20 72 65 74 75 72 6e 20 63  re this return c
24fd0 6f 64 65 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  ode too..  */.  
24fe0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
24ff0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 43 65 6c  Cell>0 );.  pCel
25000 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
25010 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
25020 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  -1);.  sqlite3Bt
25030 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
25040 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
25050 6e 66 6f 29 3b 0a 20 20 66 69 6c 6c 49 6e 43 65  nfo);.  fillInCe
25060 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ll(pParent, pare
25070 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e  ntCell, 0, info.
25080 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26  nKey, 0, 0, 0, &
25090 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 61  parentSize);.  a
250a0 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a  ssert( parentSiz
250b0 65 3c 36 34 20 29 3b 0a 20 20 61 73 73 65 72 74  e<64 );.  assert
250c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
250d0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
250e0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
250f0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
25100 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20  ent, parentIdx, 
25110 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65  parentCell, pare
25120 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20  ntSize, 0, 4);. 
25130 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
25140 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
25150 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70  nt,parentIdx), p
25160 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70  Page->pgno);.  p
25170 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
25180 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
25190 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
251a0 67 6e 6f 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 49  gnoNew);..  /* I
251b0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
251c0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
251d0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
251e0 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77  inter map.  ** w
251f0 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
25200 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
25210 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
25220 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c  om the .  ** cel
25230 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
25240 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25250 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
25260 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
25270 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
25280 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
25290 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
252a0 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  rent->pgno);.   
252b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
252c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
252d0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
252e0 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  New, 0);.    }. 
252f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
25310 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
25320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
25330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
25340 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
25350 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
25360 65 77 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61  ew page and bala
25370 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
25380 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73  age,.  ** in cas
25390 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
253a0 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73  ll inserted caus
253b0 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20  ed it to become 
253c0 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20  overfull..  */. 
253d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
253e0 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c  w);.  return bal
253f0 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29  ance(pParent, 0)
25400 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
25410 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
25420 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ALANCE */../*.**
25430 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
25440 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c  distributes Cell
25450 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75  s on pPage and u
25460 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e  p to NN*2 siblin
25470 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
25480 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
25490 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
254a0 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
254b0 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
254c0 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67  ually NN sibling
254d0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
254e0 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
254f0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
25500 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f  ng,.** though mo
25510 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  re siblings migh
25520 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
25530 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
25540 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
25550 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
25560 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
25570 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
25580 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67  han 2*NN sibling
25590 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20  s.** (something 
255a0 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
255b0 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69  appen if pPage i
255c0 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
255d0 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f  or a .** child o
255e0 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c  f root) then all
255f0 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
25600 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20  ngs participate 
25610 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
25620 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
25630 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
25640 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65  f pPage might be
25650 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
25660 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f  creased by one o
25670 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65  r.** two in an e
25680 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
25690 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
256a0 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
256b0 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  l. The root page
256c0 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61  .** is special a
256d0 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  nd is allowed to
256e0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
256f0 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a  . If pPage is .*
25700 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  * the root page,
25710 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20   then the depth 
25720 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68  of the tree migh
25730 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a  t be increased.*
25740 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  * or decreased b
25750 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73  y one, as necess
25760 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65  ary, to keep the
25770 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20   root page from 
25780 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c  being.** overful
25790 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l or completely 
257a0 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  empty..**.** Not
257b0 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
257c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
257d0 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
257e0 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a  Cells on pPage.*
257f0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
25800 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
25810 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
25820 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
25830 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
25840 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20  e is overfull.  
25850 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20  Part of the job 
25860 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
25870 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  is to.** make su
25880 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72  re all Cells for
25890 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69   pPage once agai
258a0 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e  n fit in pPage->
258b0 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49  aData[]..**.** I
258c0 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
258d0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69  balancing the si
258e0 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c  blings of pPage,
258f0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   the parent of p
25900 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  Page.** might be
25910 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
25920 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20   underfull.  If 
25930 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68  that happens, th
25940 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
25950 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ** is called rec
25960 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20  ursively on the 
25970 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  parent..**.** If
25980 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
25990 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
259a0 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
259b0 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
259c0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
259d0 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20  d state.  So if 
259e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
259f0 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
25a00 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
25a10 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
25a20 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
25a30 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65  _nonroot(MemPage
25a40 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
25a50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  age *pParent;   
25a60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25a70 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20  parent of pPage 
25a80 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
25a90 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
25aa0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
25ab0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
25ac0 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
25ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25ae0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
25af0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
25b00 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
25b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
25b20 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
25b30 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
25b40 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
25b50 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
25b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25b70 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
25b80 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
25b90 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
25ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25bb0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
25bc0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
25bd0 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  nDiv;           
25be0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25bf0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
25c00 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pDiv[] */.  int 
25c10 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
25c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
25c30 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
25c40 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
25c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25c60 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e  ndex of pPage in
25c70 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
25c80 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76  ] */.  int nxDiv
25c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25ca0 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69      /* Next divi
25cb0 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72  der slot in pPar
25cc0 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
25cd0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25cf0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
25d00 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43  e */.  int leafC
25d10 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  orrection;      
25d20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67      /* 4 if pPag
25d30 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
25d40 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  if not */.  int 
25d50 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
25d60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
25d70 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
25d80 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54  eaf of a LEAFDAT
25d90 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  A tree */.  int 
25da0 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20  usableSpace;    
25db0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
25dc0 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e  s in pPage beyon
25dd0 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  d the header */.
25de0 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b    int pageFlags;
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e00 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65  * Value of pPage
25e10 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20  ->aData[0] */.  
25e20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25e40 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
25e50 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
25e60 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
25e70 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20  iSpace1 = 0;    
25e80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
25e90 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
25ea0 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20   aSpace1[] */.  
25eb0 69 6e 74 20 69 53 70 61 63 65 32 20 3d 20 30 3b  int iSpace2 = 0;
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ed0 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
25ee0 65 20 6f 66 20 61 53 70 61 63 65 32 5b 5d 20 2a  e of aSpace2[] *
25ef0 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63  /.  int szScratc
25f00 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
25f10 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61   /* Size of scra
25f20 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65  tch memory reque
25f30 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  sted */.  MemPag
25f40 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20  e *apOld[NB];   
25f50 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
25f60 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69  and up to two si
25f70 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  blings */.  Pgno
25f80 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20   pgnoOld[NB];   
25f90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
25fa0 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
25fb0 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b  h page in apOld[
25fc0 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
25fd0 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
25fe0 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
25ff0 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
26000 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
26010 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
26020 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
26030 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
26040 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
26050 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e  lancing */.  Pgn
26060 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b  o pgnoNew[NB+2];
26070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26080 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61  e numbers for ea
26090 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77  ch page in apNew
260a0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  [] */.  u8 *apDi
260b0 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  v[NB];          
260c0 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
260d0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
260e0 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
260f0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
26100 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
26110 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
26120 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
26130 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
26140 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
26150 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
26160 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
26170 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
26180 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
26190 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
261a0 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
261b0 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
261c0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261e0 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
261f0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
26200 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43  ll[] */.  u8 *aC
26210 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
26220 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f   /* Space for ho
26230 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70  lding data of ap
26240 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Copy[] */.  u8 *
26250 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
26260 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
26270 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65  copies of divide
26280 72 73 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  rs cells before 
26290 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20  balance */.  u8 
262a0 2a 61 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20  *aSpace2 = 0;   
262b0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
262c0 20 6f 76 65 72 66 6c 6f 77 20 64 69 76 69 64 65   overflow divide
262d0 72 73 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62  rs cells after b
262e0 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a  alance */.  u8 *
262f0 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20 20 61 73  aFrom = 0;..  as
26300 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
26310 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
26320 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
26330 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20    /* .  ** Find 
26340 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
26350 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26360 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
26370 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26380 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26390 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
263a0 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76  e) || pPage->nOv
263b0 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70  erflow==1 );.  p
263c0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
263d0 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
263e0 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61  ge->pParent;.  a
263f0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29  ssert( pParent )
26400 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
26410 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
26420 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
26430 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  nt->pDbPage)) ){
26440 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
26450 20 20 7d 0a 0a 20 20 54 52 41 43 45 28 28 22 42    }..  TRACE(("B
26460 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
26470 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
26480 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
26490 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
264a0 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
264b0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
264c0 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  LANCE.  /*.  ** 
264d0 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20  A special case: 
264e0 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20   If a new entry 
264f0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e  has just been in
26500 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20  serted into a.  
26510 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69  ** table (that i
26520 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20  s, a btree with 
26530 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64  integer keys and
26540 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65   all data at the
26550 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e   leaves).  ** an
26560 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  d the new entry 
26570 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
26580 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
26590 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a  ree (it has the.
265a0 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
265b0 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73  ) then use the s
265c0 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71  pecial balance_q
265d0 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  uick() routine f
265e0 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  or.  ** balancin
265f0 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  g.  balance_quic
26600 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74  k() is much fast
26610 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69  er and results i
26620 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a  n a tighter.  **
26630 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61   packing of data
26640 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
26650 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
26660 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20  pPage->leaf &&. 
26670 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
26680 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ey &&.      pPag
26690 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
266a0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
266b0 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50  aOvfl[0].idx==pP
266c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20  age->nCell &&.  
266d0 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
266e0 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20  nt->pgno!=1 &&. 
266f0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
26700 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
26710 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
26720 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  +8])==pPage->pgn
26730 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  o.  ){.    asser
26740 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
26750 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   );.    /*.    *
26760 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
26770 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
26780 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
26790 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
267a0 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
267b0 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
267c0 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
267d0 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
267e0 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
267f0 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61  quick(pPage, pPa
26800 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rent);.  }.#endi
26810 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  f..  if( SQLITE_
26820 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
26830 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
26840 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  e->pDbPage)) ){.
26850 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26860 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
26870 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74  nd the cell in t
26880 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
26890 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20  hose left child 
268a0 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a  points back.  **
268b0 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20   to pPage.  The 
268c0 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69  "idx" variable i
268d0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
268e0 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50  hat cell.  If pP
268f0 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  age.  ** is the 
26900 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20  rightmost child 
26910 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20  of pParent then 
26920 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65  set idx to pPare
26930 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a  nt->nCell .  */.
26940 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69    if( pParent->i
26950 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50  dxShift ){.    P
26960 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67  gno pgno;.    pg
26970 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
26980 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
26990 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
269a0 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
269b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
269c0 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78    for(idx=0; idx
269d0 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b  <pParent->nCell;
269e0 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69   idx++){.      i
269f0 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  f( get4byte(find
26a00 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64  Cell(pParent, id
26a10 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  x))==pgno ){.   
26a20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26a30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
26a40 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e  sert( idx<pParen
26a50 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  t->nCell.       
26a60 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74        || get4byt
26a70 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
26a80 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
26a90 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29  fset+8])==pgno )
26aa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
26ab0 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50  dx = pPage->idxP
26ac0 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arent;.  }..  /*
26ad0 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  ** Initialize
26ae0 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68   variables so th
26af0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61  at it will be sa
26b00 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20  fe to jump.  ** 
26b10 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61  directly to bala
26b20 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61  nce_cleanup at a
26b30 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  ny moment..  */.
26b40 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20    nOld = nNew = 
26b50 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  0;.  sqlite3Page
26b60 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
26b70 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20  bPage);..  /*.  
26b80 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20  ** Find sibling 
26b90 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61  pages to pPage a
26ba0 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  nd the cells in 
26bb0 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76  pParent that div
26bc0 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62  ide.  ** the sib
26bd0 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d  lings.  An attem
26be0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
26bf0 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
26c00 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69  n either.  ** si
26c10 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f  de of pPage.  Mo
26c20 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
26c30 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
26c40 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66  ide, however, if
26c50 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72  .  ** pPage ther
26c60 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
26c70 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
26c80 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
26c90 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
26ca0 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
26cb0 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
26cc0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
26cd0 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
26ce0 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d  ..  */.  nxDiv =
26cf0 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28   idx - NN;.  if(
26d00 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50   nxDiv + NB > pP
26d10 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
26d20 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72      nxDiv = pPar
26d30 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20  ent->nCell - NB 
26d40 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  + 1;.  }.  if( n
26d50 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78  xDiv<0 ){.    nx
26d60 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  Div = 0;.  }.  n
26d70 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  Div = 0;.  for(i
26d80 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e  =0, k=nxDiv; i<N
26d90 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  B; i++, k++){.  
26da0 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d    if( k<pParent-
26db0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
26dc0 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
26dd0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b  ell(pParent, k);
26de0 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20  .      nDiv++;. 
26df0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
26e00 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20  arent->leaf );. 
26e10 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
26e20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
26e30 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
26e40 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e  if( k==pParent->
26e50 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  nCell ){.      p
26e60 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
26e70 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
26e80 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
26e90 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
26ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
26eb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
26ec0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
26ed0 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b  ge(pBt, pgnoOld[
26ee0 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70  i], &apOld[i], p
26ef0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
26f00 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
26f10 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
26f20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72  apOld[i]->idxPar
26f30 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43  ent = k;.    apC
26f40 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  opy[i] = 0;.    
26f50 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20  assert( i==nOld 
26f60 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20  );.    nOld++;. 
26f70 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
26f80 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
26f90 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
26fa0 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rflow;.  }..  /*
26fb0 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
26fc0 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
26fd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
26fe0 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
26ff0 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
27000 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
27010 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
27020 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
27030 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
27040 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
27050 20 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68    */.  szScratch
27060 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65   =.       nMaxCe
27070 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20  lls*sizeof(u8*) 
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27090 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20        /* apCell 
270a0 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65  */.     + nMaxCe
270b0 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20  lls*sizeof(u16) 
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20        /* szCell 
270e0 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44  */.     + (ROUND
270f0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
27100 29 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ))+pBt->pageSize
27110 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a  )*NB  /* aCopy *
27120 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
27130 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  geSize          
27140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27150 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20       /* aSpace1 
27160 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54  */.     + (ISAUT
27170 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65  OVACUUM ? nMaxCe
27180 6c 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20  lls : 0);       
27190 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a        /* aFrom *
271a0 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  /.  apCell = sql
271b0 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
271c0 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20  c( szScratch ); 
271d0 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
271e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
271f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
27200 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
27210 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c  nup;.  }.  szCel
27220 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
27230 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
27240 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29  aCopy[0] = (u8*)
27250 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &szCell[nMaxCell
27260 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  s];.  assert( ((
27270 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29  aCopy[0] - (u8*)
27280 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
27290 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
272a0 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
272b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
272c0 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43  NB; i++){.    aC
272d0 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b  opy[i] = &aCopy[
272e0 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  i-1][pBt->pageSi
272f0 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
27300 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20  (MemPage))];.   
27310 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79   assert( ((aCopy
27320 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  [i] - (u8*)apCel
27330 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
27340 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
27350 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
27360 7d 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61  }.  aSpace1 = &a
27370 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e  Copy[NB-1][pBt->
27380 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28  pageSize+ROUND8(
27390 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
273a0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
273b0 53 70 61 63 65 31 20 2d 20 28 75 38 2a 29 61 70  Space1 - (u8*)ap
273c0 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
273d0 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
273e0 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
273f0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
27400 55 55 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d  UUM ){.    aFrom
27410 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d   = &aSpace1[pBt-
27420 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a  >pageSize];.  }.
27430 20 20 61 53 70 61 63 65 32 20 3d 20 73 71 6c 69    aSpace2 = sqli
27440 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42  te3PageMalloc(pB
27450 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
27460 69 66 28 20 61 53 70 61 63 65 32 3d 3d 30 20 29  if( aSpace2==0 )
27470 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
27480 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
27490 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
274a0 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20  p;.  }.  .  /*. 
274b0 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   ** Make copies 
274c0 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  of the content o
274d0 66 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20  f pPage and its 
274e0 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f  siblings into aO
274f0 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72  ld[]..  ** The r
27500 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
27510 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
27520 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
27530 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74  es rather.  ** t
27540 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
27550 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
27560 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
27570 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
27580 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62   ** process of b
27590 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
275a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
275b0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
275c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d      MemPage *p =
275d0 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
275e0 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b  mPage*)aCopy[i];
275f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61  .    memcpy(p, a
27600 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28  pOld[i], sizeof(
27610 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70  MemPage));.    p
27620 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  ->aData = (void*
27630 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  )&p[1];.    memc
27640 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f  py(p->aData, apO
27650 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
27660 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
27670 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61  }..  /*.  ** Loa
27680 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  d pointers to al
27690 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69  l cells on sibli
276a0 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ng pages and the
276b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
276c0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63   ** into the loc
276d0 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61  al apCell[] arra
276e0 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  y.  Make copies 
276f0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
27700 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73  ells.  ** into s
27710 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f  pace obtained fo
27720 72 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64  rm aSpace1[] and
27730 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
27740 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
27750 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
27760 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
27770 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
27780 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
27790 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
277a0 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
277b0 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
277c0 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
277d0 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
277e0 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
277f0 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
27800 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73  ace1[].  In this
27810 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
27820 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20  in apCell[] are 
27830 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69  without.  ** chi
27840 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66  ld pointers.  If
27850 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
27860 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61  t leaves, then a
27870 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20  ll cell in.  ** 
27880 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65  apCell[] include
27890 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
278a0 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c    Either way, al
278b0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
278c0 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69  l[].  ** are ali
278d0 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65  ke..  **.  ** le
278e0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34  afCorrection:  4
278f0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
27900 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65  eaf.  0 if pPage
27910 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a   is not a leaf..
27920 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44    **       leafD
27930 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65  ata:  1 if pPage
27940 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20   holds key+data 
27950 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64  and pParent hold
27960 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a  s only keys..  *
27970 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  /.  nCell = 0;. 
27980 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20   leafCorrection 
27990 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b  = pPage->leaf*4;
279a0 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50  .  leafData = pP
279b0 61 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  age->hasData;.  
279c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
279d0 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
279e0 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
279f0 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69  y[i];.    int li
27a00 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
27a10 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
27a20 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  w;.    for(j=0; 
27a30 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20  j<limit; j++){. 
27a40 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
27a50 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
27a60 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
27a70 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
27a80 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
27a90 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
27aa0 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
27ab0 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
27ac0 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69  nCell]);.      i
27ad0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
27ae0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
27af0 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b  ;.        aFrom[
27b00 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20  nCell] = i;.    
27b10 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70      for(a=0; a<p
27b20 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20  Old->nOverflow; 
27b30 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  a++){.          
27b40 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  if( pOld->aOvfl[
27b50 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c  a].pCell==apCell
27b60 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20  [nCell] ){.     
27b70 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
27b80 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
27b90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27ba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27bb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27bc0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
27bd0 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  }.    if( i<nOld
27be0 2d 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  -1 ){.      u16 
27bf0 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
27c00 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
27c10 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  i]);.      if( l
27c20 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
27c30 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c     /* With the L
27c40 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50  EAFDATA flag, pP
27c50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64  arent cells hold
27c60 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68   only INTKEYs th
27c70 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72  at.        ** ar
27c80 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
27c90 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c  keys on the chil
27ca0 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65  d pages.  We nee
27cb0 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20  d to remove.    
27cc0 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64      ** the divid
27cd0 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50  er cells from pP
27ce0 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64  arent, but the d
27cf0 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72  ividers cells ar
27d00 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  e not.        **
27d10 20 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c   added to apCell
27d20 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20  [] because they 
27d30 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
27d40 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20  f child cells.. 
27d50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27d60 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
27d70 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
27d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27d90 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
27da0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27db0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
27dc0 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
27dd0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20  l[nCell] = sz;. 
27de0 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26         pTemp = &
27df0 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
27e00 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
27e10 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  1 += sz;.       
27e20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
27e30 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a  ->pageSize/4 );.
27e40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27e50 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61  iSpace1<=pBt->pa
27e60 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
27e70 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
27e80 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
27e90 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43         apCell[nC
27ea0 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
27eb0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
27ec0 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
27ed0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
27ee0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
27ef0 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
27f00 7d 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  }.        dropCe
27f10 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
27f20 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  v, sz);.        
27f30 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d  szCell[nCell] -=
27f40 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
27f50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27f60 20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29   get4byte(pTemp)
27f70 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a  ==pgnoOld[i] );.
27f80 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c          if( !pOl
27f90 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
27fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
27fb0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
27fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
27fd0 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72  he right pointer
27fe0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
27ff0 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20  ge pOld becomes 
28000 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20  the left.       
28010 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
28020 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
28030 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  l */.          m
28040 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65  emcpy(apCell[nCe
28050 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74  ll], &pOld->aDat
28060 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65  a[pOld->hdrOffse
28070 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  t+8], 4);.      
28080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28090 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
280a0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
280b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a            if( sz
280c0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
280d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
280e0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
280f0 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
28100 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
28110 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 65              szCe
28120 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20  ll[nCell] = 4;. 
28130 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65     }.        nCe
28150 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ll++;.      }.  
28160 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
28170 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
28180 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
28190 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
281a0 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
281b0 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
281c0 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
281d0 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
281e0 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
281f0 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
28200 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
28210 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
28220 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
28230 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
28240 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
28250 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
28260 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
28270 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
28280 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
28290 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
282a0 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
282b0 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
282c0 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
282d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
282e0 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
282f0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
28300 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
28310 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
28320 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
28330 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
28340 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
28350 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
28360 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
28370 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
28380 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
28390 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
283a0 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
283b0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
283c0 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
283d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
283e0 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
283f0 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
28400 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
28410 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
28420 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
28430 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
28440 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
28450 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
28460 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
28470 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
28480 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
28490 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
284a0 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
284b0 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
284c0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
284d0 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
284e0 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
284f0 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
28500 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
28510 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
28520 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
28530 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
28540 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
28550 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
28560 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
28570 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
28580 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
28590 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
285a0 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
285b0 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
285c0 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
285d0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
285e0 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
285f0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
28600 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
28610 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
28620 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
28630 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
28640 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
28650 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
28660 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
28670 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
28680 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
28690 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
286a0 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
286b0 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
286c0 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
286d0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
286e0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
286f0 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
28700 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
28710 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
28720 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
28730 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
28740 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
28750 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
28760 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
28770 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
28780 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
28790 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
287a0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
287b0 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
287c0 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
287d0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
287e0 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
287f0 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
28800 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
28810 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
28820 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
28830 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
28840 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
28850 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
28860 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
28870 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
28880 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
28890 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
288a0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
288b0 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
288c0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
288d0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
288e0 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
288f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
28900 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
28910 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
28920 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
28930 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
28940 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
28950 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
28960 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
28970 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
28980 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
28990 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
289a0 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
289b0 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
289c0 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
289d0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
289e0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
289f0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
28a00 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
28a10 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
28a20 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
28a30 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
28a40 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
28a50 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
28a60 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65  new[0])>0) or we
28a70 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20   are the.  ** a 
28a80 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
28a90 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f  e.  A virtual ro
28aa0 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20  ot page is when 
28ab0 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20  the real root.  
28ac0 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ** page is page 
28ad0 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65  1 and we are the
28ae0 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74   only child of t
28af0 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  hat page..  */. 
28b00 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b   assert( cntNew[
28b10 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74  0]>0 || (pParent
28b20 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ->pgno==1 && pPa
28b30 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  rent->nCell==0) 
28b40 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  );..  /*.  ** Al
28b50 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67  locate k new pag
28b60 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70  es.  Reuse old p
28b70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69  ages where possi
28b80 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ble..  */.  asse
28b90 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e  rt( pPage->pgno>
28ba0 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73  1 );.  pageFlags
28bb0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b   = pPage->aData[
28bc0 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0];.  for(i=0; i
28bd0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  <k; i++){.    Me
28be0 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20  mPage *pNew;.   
28bf0 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20   if( i<nOld ){. 
28c00 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
28c10 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b  w[i] = apOld[i];
28c20 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69  .      pgnoNew[i
28c30 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a  ] = pgnoOld[i];.
28c40 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
28c50 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
28c60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
28c70 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b  (pNew->pDbPage);
28c80 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20  .      nNew++;. 
28c90 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
28ca0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
28cb0 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
28cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
28cd0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
28ce0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
28cf0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
28d00 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65  noNew[i], pgnoNe
28d10 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20  w[i-1], 0);.    
28d20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28d30 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
28d40 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
28d50 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e  = pNew;.      nN
28d60 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ew++;.    }.  }.
28d70 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
28d80 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
28d90 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
28da0 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
28db0 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
28dc0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
28dd0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
28de0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
28df0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
28e00 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
28e10 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
28e20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
28e30 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
28e40 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
28e50 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
28e60 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
28e70 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
28e80 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
28e90 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
28ea0 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
28eb0 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
28ec0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
28ed0 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
28ee0 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
28ef0 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
28f00 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
28f10 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
28f20 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
28f30 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
28f40 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
28f50 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
28f60 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
28f70 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
28f80 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
28f90 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
28fa0 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
28fb0 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
28fc0 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
28fd0 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
28fe0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
28ff0 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
29000 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
29010 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
29020 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
29030 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
29040 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
29050 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
29060 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
29070 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
29080 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69  minV = pgnoNew[i
29090 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  ];.    int minI 
290a0 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
290b0 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
290c0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77       if( pgnoNew
290d0 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  [j]<(unsigned)mi
290e0 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
290f0 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
29100 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a  minV = pgnoNew[j
29110 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
29120 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
29130 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a  ){.      int t;.
29140 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
29150 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e  T;.      t = pgn
29160 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  oNew[i];.      p
29170 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
29180 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
29190 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   pgnoNew[minI];.
291a0 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
291b0 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
291c0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49      pgnoNew[minI
291d0 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e  ] = t;.      apN
291e0 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
291f0 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
29200 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
29210 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20   %d %d %d  new: 
29220 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
29230 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
29240 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f  d)\n",.    pgnoO
29250 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64  ld[0], .    nOld
29260 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d  >=2 ? pgnoOld[1]
29270 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
29280 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a  3 ? pgnoOld[2] :
29290 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b   0,.    pgnoNew[
292a0 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  0], szNew[0],.  
292b0 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f    nNew>=2 ? pgno
292c0 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[1] : 0, nNew
292d0 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
292e0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
292f0 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30  ? pgnoNew[2] : 0
29300 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
29310 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
29320 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=4 ? pgnoNew[
29330 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  3] : 0, nNew>=4 
29340 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
29350 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67      nNew>=5 ? pg
29360 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e  noNew[4] : 0, nN
29370 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
29380 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20   : 0));..  /*.  
29390 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
293a0 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
293b0 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
293c0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
293d0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
293e0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
293f0 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
29400 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
29410 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
29420 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
29430 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
29440 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
29450 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
29460 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
29470 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
29480 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
29490 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
294a0 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d  pgno==pgnoNew[i]
294b0 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
294c0 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
294d0 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
294e0 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
294f0 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
29500 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
29510 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
29520 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
29530 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
29540 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
29550 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
29560 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20  rflow==0 );..   
29570 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
29580 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
29590 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
295a0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
295b0 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68  ntries.    ** th
295c0 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  at point to the 
295d0 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
295e0 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54  re rearranged. T
295f0 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66  hese can be: lef
29600 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65  t.    ** childre
29610 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20  n of cells, the 
29620 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
29630 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72  he page, or over
29640 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
29650 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
29660 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  cells..    */.  
29670 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
29680 55 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  UM ){.      for(
29690 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d  k=j; k<cntNew[i]
296a0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
296b0 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65  assert( k<nMaxCe
296c0 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69  lls );.        i
296d0 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46  f( aFrom[k]==0xF
296e0 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
296f0 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[k]]->pgno!=pNe
29700 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  w->pgno ){.     
29710 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
29720 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d  PutOvfl(pNew, k-
29730 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
29740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29750 26 26 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  && leafCorrectio
29760 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
29770 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
29780 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ut(pBt, get4byte
29790 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52  (apCell[k]), PTR
297a0 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d  MAP_BTREE, pNew-
297b0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
297c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
297d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
297e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
297f0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
29800 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nup;.          }
29810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29820 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20   }.    }..    j 
29830 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
29840 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
29850 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
29860 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
29870 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
29880 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
29890 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
298a0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
298b0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
298c0 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65  */.    if( i<nNe
298d0 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29  w-1 && j<nCell )
298e0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
298f0 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
29900 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
29910 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
29920 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
29930 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
29940 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
29950 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
29960 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
29970 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
29980 53 70 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b  Space2[iSpace2];
29990 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
299a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
299b0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
299c0 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
299d0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   4);.        if(
299e0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 0a 20   ISAUTOVACUUM . 
299f0 20 20 20 20 20 20 20 20 26 26 20 28 61 46 72 6f          && (aFro
29a00 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70  m[j]==0xFF || ap
29a10 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e  Copy[aFrom[j]]->
29a20 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
29a30 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
29a40 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
29a50 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
29a60 79 74 65 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d  yte(pCell), PTRM
29a70 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
29a80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
29a90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29aa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29ab0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
29ac0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
29ad0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29ae0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
29af0 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
29b00 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65    /* If the tree
29b10 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
29b20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
29b30 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
29b40 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
29b50 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
29b60 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
29b70 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
29b80 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
29b90 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
29ba0 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
29bb0 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
29bc0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
29bd0 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
29be0 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
29bf0 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
29c00 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
29c10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
29c20 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
29c30 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
29c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
29c50 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
29c60 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
29c70 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
29c80 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20   = pTemp;.      
29c90 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61    fillInCell(pPa
29ca0 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20  rent, pCell, 0, 
29cb0 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
29cc0 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20   0, &sz);.      
29cd0 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
29ce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29cf0 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
29d00 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
29d10 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
29d20 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
29d30 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
29d40 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
29d50 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
29d60 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
29d70 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70  ode, and its rep
29d80 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34  orted size was 4
29d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
29da0 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61  s, then it may a
29db0 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c  ctually be small
29dc0 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20  er than this .  
29dd0 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71        ** (see sq
29de0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
29df0 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
29e00 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
29e10 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
29e20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
29e30 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
29e40 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
29e50 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
29e60 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
29e70 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
29e80 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
29e90 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
29ea0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
29eb0 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
29ec0 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
29ed0 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
29ee0 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
29ef0 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
29f00 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
29f10 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
29f20 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
29f30 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
29f40 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
29f50 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
29f60 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
29f70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
29f80 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
29f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
29fa0 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
29fb0 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
29fc0 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
29fd0 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
29fe0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
29ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61      }.      iSpa
2a000 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce2 += sz;.     
2a010 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
2a020 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a  ->pageSize/4 );.
2a030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
2a040 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65  pace2<=pBt->page
2a050 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63  Size );.      rc
2a060 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2a070 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43  arent, nxDiv, pC
2a080 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20  ell, sz, pTemp, 
2a090 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  4);.      if( rc
2a0a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2a0b0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2a0c0 75 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  up;.      put4by
2a0d0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
2a0e0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69  ell(pParent,nxDi
2a0f0 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  v), pNew->pgno);
2a100 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2a110 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2a120 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61  cuum database, a
2a130 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61  nd not a leaf-da
2a140 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a  ta tree,.      *
2a150 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20 74 68  * then update th
2a160 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69  e pointer map wi
2a170 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  th an entry for 
2a180 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2a190 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  e.      ** that 
2a1a0 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e  the cell just in
2a1b0 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f  serted points to
2a1c0 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20   (if any)..     
2a1d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53   */.      if( IS
2a1e0 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c  AUTOVACUUM && !l
2a1f0 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
2a200 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2a210 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tOvfl(pParent, n
2a220 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69  xDiv);.        i
2a230 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2a250 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2a260 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
2a270 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b      }.      j++;
2a280 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
2a290 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
2a2a0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
2a2b0 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
2a2c0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
2a2d0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41  . */.    if( ISA
2a2e0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2a2f0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2a300 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
2a310 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
2a320 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
2a330 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2a340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a350 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2a360 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2a370 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
2a380 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29  sert( j==nCell )
2a390 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64  ;.  assert( nOld
2a3a0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2a3b0 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20  nNew>0 );.  if( 
2a3c0 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46  (pageFlags & PTF
2a3d0 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEAF)==0 ){.   
2a3e0 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61   u8 *zChild = &a
2a3f0 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61  pCopy[nOld-1]->a
2a400 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d  Data[8];.    mem
2a410 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d  cpy(&apNew[nNew-
2a420 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43  1]->aData[8], zC
2a430 68 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66  hild, 4);.    if
2a440 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2a450 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2a460 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34  mapPut(pBt, get4
2a470 62 79 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54  byte(zChild), PT
2a480 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65  RMAP_BTREE, apNe
2a490 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
2a4a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2a4b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a4c0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2a4d0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2a4e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2a4f0 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e  f( nxDiv==pParen
2a500 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74  t->nCell+pParent
2a510 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
2a520 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74     /* Right-most
2a530 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20   sibling is the 
2a540 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
2a550 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   of pParent */. 
2a560 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2a570 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2a580 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2a590 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d  ], pgnoNew[nNew-
2a5a0 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1]);.  }else{.  
2a5b0 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20    /* Right-most 
2a5c0 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c  sibling is the l
2a5d0 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65  eft child of the
2a5e0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2a5f0 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  pParent.    ** p
2a600 61 73 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ast the right-mo
2a610 73 74 20 64 69 76 69 64 65 72 20 65 6e 74 72 79  st divider entry
2a620 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2a630 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
2a640 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2a650 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d  ), pgnoNew[nNew-
2a660 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  1]);.  }..  /*. 
2a670 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63 68 69   ** Reparent chi
2a680 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63 65 6c  ldren of all cel
2a690 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
2a6a0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
2a6b0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  {.    rc = repar
2a6c0 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 61 70  entChildPages(ap
2a6d0 4e 65 77 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20  New[i], 0);.    
2a6e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a6f0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
2a700 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
2a710 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
2a720 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 2c  ldPages(pParent,
2a730 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
2a740 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2a750 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2a760 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
2a770 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
2a780 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
2a790 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2a7a0 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
2a7b0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
2a7c0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2a7d0 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
2a7e0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
2a7f0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
2a800 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
2a810 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
2a820 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
2a830 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2a840 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
2a850 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  .  sqlite3Scratc
2a860 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  hFree(apCell);. 
2a870 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 72   apCell = 0;.  r
2a880 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 72  c = balance(pPar
2a890 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a  ent, 0);.  .  /*
2a8a0 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
2a8b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2a8c0 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
2a8d0 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 50  anup:.  sqlite3P
2a8e0 61 67 65 46 72 65 65 28 61 53 70 61 63 65 32 29  ageFree(aSpace2)
2a8f0 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  ;.  sqlite3Scrat
2a900 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
2a910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
2a920 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
2a930 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
2a940 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
2a950 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
2a960 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2a970 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
2a980 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2a990 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28  arent);.  TRACE(
2a9a0 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
2a9b0 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64  hed with %d: old
2a9c0 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
2a9d0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2a9e0 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e    pPage->pgno, n
2a9f0 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
2aa00 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
2aa10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2aa20 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2aa30 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
2aa40 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68  ge of a btree wh
2aa50 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  en the root.** p
2aa60 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
2aa70 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20  cells.  This is 
2aa80 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
2aa90 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a  o make the tree.
2aaa0 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20  ** shallower by 
2aab0 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  one level..*/.st
2aac0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2aad0 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61  _shallower(MemPa
2aae0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
2aaf0 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
2ab00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2ab10 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67  e only child pag
2ab20 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  e of pPage */.  
2ab30 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ab50 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
2ab60 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  pChild */.  int 
2ab70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2ab80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2ab90 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
2aba0 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
2abb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
2abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abd0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65  /* The main BTre
2abe0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
2abf0 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61   int mxCellPerPa
2ac00 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
2ac10 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2ac20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67  of cells per pag
2ac30 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
2ac40 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2ac50 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
2ac60 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e   from pages bein
2ac70 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
2ac80 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aca0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
2acb0 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73  l cells */..  as
2acc0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
2acd0 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
2ace0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2acf0 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2ad00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2ad10 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2ad20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74  >mutex) );.  pBt
2ad30 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2ad40 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d   mxCellPerPage =
2ad50 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20   MX_CELL(pBt);. 
2ad60 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
2ad70 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50  3Malloc( mxCellP
2ad80 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
2ad90 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29  8*)+sizeof(u16))
2ada0 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
2adb0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2adc0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
2add0 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
2ade0 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
2adf0 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
2ae00 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
2ae10 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
2ae20 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
2ae30 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
2ae40 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
2ae50 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
2ae60 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
2ae70 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
2ae80 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
2ae90 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
2aea0 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
2aeb0 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2aec0 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
2aed0 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
2aee0 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
2aef0 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
2af00 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
2af10 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
2af20 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
2af30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2af40 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2af50 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
2af60 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
2af70 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
2af80 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
2af90 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
2afa0 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
2afb0 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2afc0 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
2afd0 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
2afe0 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
2aff0 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
2b000 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
2b010 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
2b020 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
2b030 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
2b040 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
2b050 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
2b060 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
2b070 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
2b080 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
2b090 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
2b0a0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
2b0b0 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
2b0c0 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
2b0d0 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
2b0e0 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
2b0f0 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
2b100 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
2b110 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
2b120 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2b130 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2b140 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
2b150 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
2b160 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2b170 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72 50  gnoChild<=pagerP
2b180 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e  agecount(pPage->
2b190 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a  pBt->pPager) );.
2b1a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b1b0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50 61  BtreeGetPage(pPa
2b1c0 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69  ge->pBt, pgnoChi
2b1d0 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b  ld, &pChild, 0);
2b1e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2b1f0 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
2b200 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20  alance;.    if( 
2b210 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pPage->pgno==1 )
2b220 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2b230 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2b240 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
2b250 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2b260 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2b270 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
2b280 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2b290 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2b2a0 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c  .      if( pChil
2b2b0 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b  d->nFree>=100 ){
2b2c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2b2d0 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f  child informatio
2b2e0 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  n will fit on th
2b2f0 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20  e root page, so 
2b300 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  do the.        *
2b310 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20  * copy */.      
2b320 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
2b330 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2b340 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
2b350 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ]);.        for(
2b360 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
2b370 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2b380 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20        apCell[i] 
2b390 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c  = findCell(pChil
2b3a0 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d,i);.          
2b3b0 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c  szCell[i] = cell
2b3c0 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20  SizePtr(pChild, 
2b3d0 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  apCell[i]);.    
2b3e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2b3f0 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65  semblePage(pPage
2b400 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c  , pChild->nCell,
2b410 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29   apCell, szCell)
2b420 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;.        /* Cop
2b430 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  y the right-poin
2b440 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
2b450 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20   to the parent. 
2b460 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  */.        put4b
2b470 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2b480 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2b490 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20  et+8], .        
2b4a0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43      get4byte(&pC
2b4b0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69  hild->aData[pChi
2b4c0 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
2b4d0 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  ));.        free
2b4e0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2b4f0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
2b500 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
2b510 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65  transfer to page
2b520 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
2b530 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gno));.      }el
2b540 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2b550 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72  he child has mor
2b560 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  e information th
2b570 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  at will fit on t
2b580 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20  he root..       
2b590 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20   ** The tree is 
2b5a0 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64  already balanced
2b5b0 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  .  Do nothing. *
2b5c0 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  /.        TRACE(
2b5d0 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
2b5e0 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74   %d will not fit
2b5f0 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   on page 1\n", p
2b600 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
2b610 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2b620 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2b630 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68  Page->aData, pCh
2b640 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67  ild->aData, pPag
2b650 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2b660 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
2b670 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2b680 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
2b690 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  nt = 0;.      rc
2b6a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2b6b0 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
2b6c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2b6d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b6e0 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65  ;.      freePage
2b6f0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2b700 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2b710 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20   transfer child 
2b720 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c  %d into root %d\
2b730 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2b740 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20    pChild->pgno, 
2b750 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2b760 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65     }.    rc = re
2b770 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
2b780 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20  (pPage, 1);.    
2b790 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2b7a0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
2b7b0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2b7c0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  UUM ){.      int
2b7d0 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
2b7e0 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
2b7f0 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  l; i++){ .      
2b800 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2b810 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Ovfl(pPage, i);.
2b820 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2b830 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b840 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2b850 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2b860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b870 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c   }.    }.    rel
2b880 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
2b890 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f  ;.  }.end_shallo
2b8a0 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c  w_balance:.  sql
2b8b0 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c  ite3_free(apCell
2b8c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b8d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f  }.../*.** The ro
2b8e0 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  ot page is overf
2b8f0 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ull.**.** When t
2b900 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65  his happens, Cre
2b910 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20  ate a new child 
2b920 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68  page and copy th
2b930 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
2b940 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74   the root into t
2b950 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20  he child.  Then 
2b960 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  make the root.**
2b970 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70   page an empty p
2b980 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68  age with rightCh
2b990 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ild pointing to 
2b9a0 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64  the new.** child
2b9b0 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c  .   Finally, cal
2b9c0 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e  l balance_intern
2b9d0 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  al() on the new 
2b9e0 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73  child.** to caus
2b9f0 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a  e it to split..*
2ba00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2ba10 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
2ba20 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
2ba30 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2ba40 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
2ba50 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
2ba60 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
2ba70 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f  ge *pChild;    /
2ba80 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
2ba90 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
2baa0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2bab0 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  d;     /* Page n
2bac0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
2bad0 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2bae0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2baf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
2bb00 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  Tree */.  int us
2bb10 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  ableSize;     /*
2bb20 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69   Total usable si
2bb30 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a  ze of a page */.
2bb40 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2bb50 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2bb60 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
2bb70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61  age */.  u8 *cda
2bb80 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
2bb90 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  Content of the c
2bba0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  hild page */.  i
2bbb0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
2bbc0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2bbd0 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70  page header in p
2bbe0 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
2bbf0 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  brk;           /
2bc00 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74  * Offset to cont
2bc10 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ent of first cel
2bc20 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a  l in parent */..
2bc30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bc40 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20  >pParent==0 );. 
2bc50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2bc60 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
2bc70 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2bc80 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2bc90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2bca0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2bcb0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2bcc0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43  reePage(pBt, &pC
2bcd0 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64  hild, &pgnoChild
2bce0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30  , pPage->pgno, 0
2bcf0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2bd00 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
2bd10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2bd20 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
2bd30 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
2bd40 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
2bd50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
2bd60 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2bd70 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
2bd80 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2bd90 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74    cbrk = get2byt
2bda0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
2bdb0 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c  .  cdata = pChil
2bdc0 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63  d->aData;.  memc
2bdd0 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b  py(cdata, &data[
2bde0 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c  hdr], pPage->cel
2bdf0 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d  lOffset+2*pPage-
2be00 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d  >nCell-hdr);.  m
2be10 65 6d 63 70 79 28 26 63 64 61 74 61 5b 63 62 72  emcpy(&cdata[cbr
2be20 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
2be30 20 75 73 61 62 6c 65 53 69 7a 65 2d 63 62 72 6b   usableSize-cbrk
2be40 29 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d  );.  if( pChild-
2be50 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  >isInit ) return
2be60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
2be70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2be80 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68  treeInitPage(pCh
2be90 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69  ild, pPage);.  i
2bea0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2beb0 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
2bec0 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d    memcpy(pChild-
2bed0 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61  >aOvfl, pPage->a
2bee0 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76  Ovfl, pPage->nOv
2bef0 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50  erflow*sizeof(pP
2bf00 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b  age->aOvfl[0]));
2bf10 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  .  pChild->nOver
2bf20 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f  flow = pPage->nO
2bf30 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70  verflow;.  if( p
2bf40 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2bf50 20 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e   ){.    pChild->
2bf60 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  nFree = 0;.  }. 
2bf70 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2bf80 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e  >nCell==pPage->n
2bf90 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61  Cell );.  zeroPa
2bfa0 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
2bfb0 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54  ->aData[0] & ~PT
2bfc0 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62  F_LEAF);.  put4b
2bfd0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2bfe0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2bff0 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64  et+8], pgnoChild
2c000 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
2c010 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20  ANCE: copy root 
2c020 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70  %d into %d\n", p
2c030 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69  Page->pgno, pChi
2c040 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 69 66  ld->pgno));.  if
2c050 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2c060 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2c070 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2c080 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  pBt, pChild->pgn
2c090 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
2c0a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
2c0b0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2c0c0 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f   balancedeeper_o
2c0d0 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ut;.    for(i=0;
2c0e0 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
2c0f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
2c100 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
2c110 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20  (pChild, i);.   
2c120 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c140 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70  goto balancedeep
2c150 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
2c160 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72      }.    rc = r
2c170 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
2c180 73 28 70 43 68 69 6c 64 2c 20 31 29 3b 0a 20 20  s(pChild, 1);.  
2c190 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2c1a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2c1b0 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
2c1c0 74 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a  t(pChild);.  }..
2c1d0 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
2c1e0 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
2c1f0 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75  (pChild);.  retu
2c200 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c210 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70 61  Decide if the pa
2c220 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20 74  ge pPage needs t
2c230 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20 20  o be balanced.  
2c240 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a  If balancing is.
2c250 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61 6c  ** required, cal
2c260 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  l the appropriat
2c270 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  e balancing rout
2c280 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
2c290 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
2c2a0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
2c2b0 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63  nsert){.  int rc
2c2c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c2d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c2e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2c2f0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2c300 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
2c310 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  arent==0 ){.    
2c320 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c330 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2c340 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2c350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c360 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2c370 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  w>0 ){.      rc 
2c380 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
2c390 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
2c3a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c3b0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
2c3c0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
2c3d0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68   rc = balance_sh
2c3e0 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a  allower(pPage);.
2c3f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2c400 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
2c410 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20  verflow>0 || .  
2c420 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20 26        (!insert &
2c430 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70  & pPage->nFree>p
2c440 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2c450 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20  eSize*2/3) ){.  
2c460 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2c470 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b  _nonroot(pPage);
2c480 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2c490 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c4a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
2c4b0 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73  ecks all cursors
2c4c0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
2c4d0 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  able pgnoRoot..*
2c4e0 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73  * If any of thos
2c4f0 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f  e cursors were o
2c500 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
2c510 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72  g==0 in a differ
2c520 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
2c530 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61  connection (a da
2c540 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2c550 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  n that shares th
2c560 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65  e pager.** cache
2c570 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
2c580 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e  t connection) an
2c590 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e  d that other con
2c5a0 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e  nection .** is n
2c5b0 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e  ot in the ReadUn
2c5c0 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65  commmitted state
2c5d0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
2c5e0 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ine returns .** 
2c5f0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
2c600 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20  *.** As well as 
2c610 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46  cursors with wrF
2c620 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20  lag==0, cursors 
2c630 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 20 61  with wrFlag==1 a
2c640 6e 64 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f  nd .** isIncrblo
2c650 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61  bHandle==1 are a
2c660 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65 64 20 27  lso considered '
2c670 72 65 61 64 27 20 63 75 72 73 6f 72 73 2e 20 49  read' cursors. I
2c680 6e 63 72 65 6d 65 6e 74 61 6c 20 0a 2a 2a 20 62  ncremental .** b
2c690 6c 6f 62 20 63 75 72 73 6f 72 73 20 61 72 65 20  lob cursors are 
2c6a0 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65  used for both re
2c6b0 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
2c6c0 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67  g..**.** When pg
2c6d0 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f  noRoot is the ro
2c6e0 6f 74 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e  ot page of an in
2c6f0 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73  tkey table, this
2c700 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73   function is als
2c710 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65  o.** responsible
2c720 20 66 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e   for invalidatin
2c730 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  g incremental bl
2c740 6f 62 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20  ob cursors when 
2c750 74 68 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a  the table row.**
2c760 20 6f 6e 20 77 68 69 63 68 20 74 68 65 79 20 61   on which they a
2c770 72 65 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c  re opened is del
2c780 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64  eted or modified
2c790 2e 20 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e  . Cursors are in
2c7a0 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63  validated.** acc
2c7b0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f  ording to the fo
2c7c0 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  llowing rules:.*
2c7d0 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42  *.**   1) When B
2c7e0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
2c7f0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
2c800 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20  mpletely delete 
2c810 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
2c820 20 20 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65       of a B-Tree
2c830 20 74 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65   table, pExclude
2c840 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   is set to zero 
2c850 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52  and parameter iR
2c860 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73  ow is .**      s
2c870 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  et to non-zero. 
2c880 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
2c890 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2c8a0 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a  b cursors open.*
2c8b0 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61  *      on the ta
2c8c0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67  ble rooted at pg
2c8d0 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c  noRoot are inval
2c8e0 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
2c8f0 32 29 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73  2) When BtreeIns
2c900 65 72 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65  ert(), BtreeDele
2c910 74 65 28 29 20 6f 72 20 42 74 72 65 65 50 75 74  te() or BtreePut
2c920 44 61 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64  Data() is called
2c930 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64   to .**      mod
2c940 69 66 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20  ify a table row 
2c950 76 69 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65  via an SQL state
2c960 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69  ment, pExclude i
2c970 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
2c980 20 20 20 20 20 20 77 72 69 74 65 20 63 75 72 73        write curs
2c990 6f 72 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68  or used to do th
2c9a0 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61  e modification a
2c9b0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f  nd parameter iRo
2c9c0 77 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20  w is set.**     
2c9d0 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20   to the integer 
2c9e0 72 6f 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d  row id of the B-
2c9f0 54 72 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67  Tree entry being
2ca00 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73   modified. Unles
2ca10 73 0a 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75  s.**      pExclu
2ca20 64 65 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20  de is itself an 
2ca30 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2ca40 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c   cursor, then al
2ca50 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  l incremental.**
2ca60 20 20 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f        blob curso
2ca70 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69  rs open on row i
2ca80 52 6f 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65  Row of the B-Tre
2ca90 65 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  e are invalidate
2caa0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66  d..**.**   3) If
2cab0 20 62 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61   both pExclude a
2cac0 6e 64 20 69 52 6f 77 20 61 72 65 20 73 65 74 20  nd iRow are set 
2cad0 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72  to zero, no incr
2cae0 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a  emental blob .**
2caf0 20 20 20 20 20 20 63 75 72 73 6f 72 73 20 61 72        cursors ar
2cb00 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
2cb10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
2cb20 63 6b 52 65 61 64 4c 6f 63 6b 73 28 0a 20 20 42  ckReadLocks(.  B
2cb30 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 0a 20  tree *pBtree, . 
2cb40 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
2cb50 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
2cb60 63 6c 75 64 65 2c 0a 20 20 69 36 34 20 69 52 6f  clude,.  i64 iRo
2cb70 77 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  w.){.  BtCursor 
2cb80 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
2cb90 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
2cba0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2cbb0 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20   = pBtree->db;. 
2cbc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2cbd0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2cbe0 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72  pBtree) );.  for
2cbf0 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
2cc00 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
2cc10 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
2cc20 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
2cc30 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
2cc40 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
2cc50 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
2cc60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
2cc70 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20  NCRBLOB.    if( 
2cc80 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
2cc90 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20  dle && ( .      
2cca0 20 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26     (!pExclude &&
2ccb0 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20   iRow).      || 
2ccc0 28 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45  (pExclude && !pE
2ccd0 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c  xclude->isIncrbl
2cce0 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69  obHandle && p->i
2ccf0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a  nfo.nKey==iRow).
2cd00 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d      )){.      p-
2cd10 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2cd20 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a  _INVALID;.    }.
2cd30 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
2cd40 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2cd50 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75  _VALID ) continu
2cd60 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72  e;.    if( p->wr
2cd70 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66  Flag==0 .#ifndef
2cd80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2cd90 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d  RBLOB.     || p-
2cda0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2cdb0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  e.#endif.    ){.
2cdc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2cdd0 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72  bOther = p->pBtr
2cde0 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 69 66  ee->db;.      if
2cdf0 28 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a  ( dbOther==0 ||.
2ce00 20 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65           (dbOthe
2ce10 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65  r!=db && (dbOthe
2ce20 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  r->flags & SQLIT
2ce30 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2ce40 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  d)==0) ){.      
2ce50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ce60 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a  LOCKED;.      }.
2ce70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2ce80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ce90 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2cea0 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
2ceb0 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20  the BTree.  The 
2cec0 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20  key is given by 
2ced0 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61  (pKey,nKey).** a
2cee0 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67  nd the data is g
2cef0 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e  iven by (pData,n
2cf00 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73  Data).  The curs
2cf10 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  or is used only 
2cf20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61  to.** define wha
2cf30 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f  t table the reco
2cf40 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rd should be ins
2cf50 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65  erted into.  The
2cf60 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2cf70 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2cf80 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2cf90 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49  ..**.** For an I
2cfa0 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c  NTKEY table, onl
2cfb0 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65  y the nKey value
2cfc0 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75   of the key is u
2cfd0 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
2cfe0 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61   ignored.  For a
2cff0 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c   ZERODATA table,
2d000 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e   the pData and n
2d010 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67  Data are both ig
2d020 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
2d030 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
2d040 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2d050 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2d060 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
2d070 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  a into the table
2d080 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   of this cursor 
2d090 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2d0a0 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2d0b0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f      /* The key o
2d0c0 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2d0d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2d0e0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
2d0f0 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ta,  /* The data
2d100 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
2d110 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  rd */.  int nZer
2d120 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
2d130 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d140 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65   of extra 0 byte
2d150 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64  s to append to d
2d160 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70  ata */.  int app
2d170 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20 20  endBias         
2d180 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d190 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c  if this is likel
2d1a0 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29  y an append */.)
2d1b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2d1c0 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e  t loc;.  int szN
2d1d0 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ew;.  MemPage *p
2d1e0 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
2d1f0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
2d200 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2d210 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
2d220 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
2d230 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
2d240 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
2d250 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
2d260 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2d270 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42  Cur) );.  if( pB
2d280 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2d290 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2d2a0 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2d2b0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2d2c0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   before doing an
2d2d0 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72   insert */.    r
2d2e0 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
2d2f0 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2d300 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2d310 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  OR;.    return r
2d320 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2d330 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2d340 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e  );.  if( !pCur->
2d350 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
2d360 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2d370 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f  ;   /* Cursor no
2d380 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  t open for writi
2d390 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2d3a0 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2d3b0 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
2d3c0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2d3d0 72 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20  r, nKey) ){.    
2d3e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2d3f0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2d400 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2d410 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2d420 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
2d430 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2d440 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2d450 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
2d460 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61  ip;.  }..  /* Sa
2d470 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2d480 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2d490 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
2d4a0 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c  is table */.  cl
2d4b0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2d4c0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a  n(pCur);.  if( .
2d4d0 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
2d4e0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2d4f0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
2d500 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20  gnoRoot, pCur)) 
2d510 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ||.    SQLITE_OK
2d520 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
2d530 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
2d540 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
2d550 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
2d560 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2d570 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
2d580 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2d590 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d5a0 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
2d5b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d5c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
2d5d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
2d5e0 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52  .  TRACE(("INSER
2d5f0 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79  T: table=%d nkey
2d600 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70  =%lld ndata=%d p
2d610 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  age=%d %s\n",.  
2d620 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
2d630 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44  noRoot, nKey, nD
2d640 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ata, pPage->pgno
2d650 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d  ,.          loc=
2d660 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22  =0 ? "overwrite"
2d670 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29   : "new entry"))
2d680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2d690 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
2d6a0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
2d6b0 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c  (pBt);.  newCell
2d6c0 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
2d6d0 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  e;.  if( newCell
2d6e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2d6f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
2d700 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
2d710 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
2d720 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
2d730 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
2d740 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
2d750 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2d760 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
2d770 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
2d780 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
2d790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
2d7a0 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
2d7b0 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c  (pBt) );.  if( l
2d7c0 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
2d7d0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2d7e0 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ate ){.    u16 s
2d7f0 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
2d800 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
2d810 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
2d820 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2d830 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d840 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2d850 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2d860 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
2d870 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
2d880 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d   }.    oldCell =
2d890 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2d8a0 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20   pCur->idx);.   
2d8b0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2d8c0 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
2d8d0 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
2d8e0 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
2d8f0 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
2d900 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
2d910 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
2d920 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2d930 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69   oldCell);.    i
2d940 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2d950 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f  _insert;.    dro
2d960 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  pCell(pPage, pCu
2d970 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a  r->idx, szOld);.
2d980 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
2d990 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
2d9a0 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
2d9b0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
2d9c0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b  ;.    pCur->idx+
2d9d0 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  +;.    pCur->inf
2d9e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
2d9f0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
2da00 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2da10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2da20 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
2da30 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2da40 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2da50 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77  , newCell, szNew
2da60 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
2da70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2da80 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2da90 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2daa0 50 61 67 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Page, 1);.  if( 
2dab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2dac0 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
2dad0 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69  pCur);.  }.end_i
2dae0 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20  nsert:.  return 
2daf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
2db00 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68  ete the entry th
2db10 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
2db20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
2db30 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
2db40 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2db50 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
2db60 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
2db70 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74  e3BtreeDelete(Bt
2db80 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2db90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2dba0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2dbb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2dbc0 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  pCell;.  int rc;
2dbd0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2dbe0 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a  d = 0;.  Btree *
2dbf0 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
2dc00 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2dc10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
2dc20 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2dc30 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2dc40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2dc50 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2dc60 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2dc70 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2dc80 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2dc90 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2dca0 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
2dcb0 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  g a delete */.  
2dcc0 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2dcd0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2dce0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2dcf0 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2dd00 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2dd10 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2dd20 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ly );.  if( pCur
2dd30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2dd40 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
2dd50 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
2dd60 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
2dd70 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e  >idx >= pPage->n
2dd80 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Cell ){.    retu
2dd90 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2dda0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2ddb0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2ddc0 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  to anything */. 
2ddd0 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e   }.  if( !pCur->
2dde0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
2ddf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2de00 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f  ;   /* Did not o
2de10 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20  pen this cursor 
2de20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2de30 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2de40 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2de50 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2de60 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72  Root, pCur, pCur
2de70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a  ->info.nKey) ){.
2de80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2de90 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65  E_LOCKED; /* The
2dea0 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
2deb0 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
2dec0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20   lock */.  }..  
2ded0 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  /* Restore the c
2dee0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
2def0 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20  sition (a no-op 
2df00 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2df10 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55   not in .  ** CU
2df20 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2df30 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65   state) and save
2df40 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2df50 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
2df60 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f  ors .  ** open o
2df70 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
2df80 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69  . Then call sqli
2df90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2dfa0 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a  on the page.  **
2dfb0 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
2dfc0 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
2dfd0 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
2dfe0 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74   .    (rc = rest
2dff0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2e000 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  n(pCur))!=0 ||. 
2e010 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c     (rc = saveAll
2e020 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
2e030 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2e040 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
2e050 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e060 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2e070 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20  Page))!=0.  ){. 
2e080 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e090 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
2e0a0 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69  he cell within i
2e0b0 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  ts page and leav
2e0c0 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
2e0d0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
2e0e0 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
2e0f0 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
2e100 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2e110 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2e120 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
2e130 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
2e140 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
2e150 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20  .  */.  pCell = 
2e160 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2e170 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66  pCur->idx);.  if
2e180 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2e190 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
2e1a0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
2e1b0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
2e1c0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
2e1d0 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
2e1e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2e1f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
2e200 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e210 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65   /*.    ** The e
2e220 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f 75  ntry we are abou
2e230 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e  t to delete is n
2e240 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20  ot a leaf so if 
2e250 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  we do not.    **
2e260 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   do something we
2e270 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f   will leave a ho
2e280 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61  le on an interna
2e290 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57  l page..    ** W
2e2a0 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74  e have to fill t
2e2b0 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e  he hole by movin
2e2c0 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d  g in a cell from
2e2d0 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20   a leaf.  The.  
2e2e0 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61    ** next Cell a
2e2f0 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20  fter the one to 
2e300 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67 75  be deleted is gu
2e310 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
2e320 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20  t and.    ** to 
2e330 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20  be a leaf so we 
2e340 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  can use it..    
2e350 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  */.    BtCursor 
2e360 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73  leafCur;.    uns
2e370 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78  igned char *pNex
2e380 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  t;.    int notUs
2e390 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ed;.    unsigned
2e3a0 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20   char *tempCell 
2e3b0 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2e3c0 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
2e3d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
2e3e0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
2e3f0 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29  (pCur, &leafCur)
2e400 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e410 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61  e3BtreeNext(&lea
2e420 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b  fCur, &notUsed);
2e430 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e450 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e460 72 57 72 69 74 65 28 6c 65 61 66 43 75 72 2e 70  rWrite(leafCur.p
2e470 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2e480 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2e490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e4a0 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74 3b       u16 szNext;
2e4b0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44  .      TRACE(("D
2e4c0 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2e4d0 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20  delete internal 
2e4e0 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20  from %d replace 
2e4f0 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2e500 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  .         pCur->
2e510 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2e520 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70  >pgno, leafCur.p
2e530 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2e540 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2e550 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
2e560 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2e570 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  , pCell));.     
2e580 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c   pNext = findCel
2e590 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2e5a0 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20   leafCur.idx);. 
2e5b0 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
2e5c0 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75  llSizePtr(leafCu
2e5d0 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  r.pPage, pNext);
2e5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2e5f0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2e600 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2e610 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
2e620 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
2e630 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74    tempCell = pBt
2e640 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
2e650 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d     if( tempCell=
2e660 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2e670 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2e680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2e6b0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2e6c0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e  e, pCur->idx, pN
2e6d0 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c  ext-4, szNext+4,
2e6e0 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20   tempCell, 0);. 
2e6f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2e700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e710 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
2e720 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
2e730 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2e740 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64  >idx), pgnoChild
2e750 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2e760 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30  balance(pPage, 0
2e770 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e780 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e790 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72  OK ){.        dr
2e7a0 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  opCell(leafCur.p
2e7b0 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
2e7c0 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20  x, szNext);.    
2e7d0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2e7e0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2e7f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2e800 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
2e810 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
2e820 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  sor(&leafCur);. 
2e830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43   }else{.    TRAC
2e840 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2e850 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d  e=%d delete from
2e860 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2e870 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2e880 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ot, pPage->pgno)
2e890 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  );.    dropCell(
2e8a0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2e8b0 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
2e8c0 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
2e8d0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2e8e0 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Page, 0);.  }.  
2e8f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e900 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2e910 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  oot(pCur);.  }. 
2e920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e930 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2e940 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
2e950 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
2e960 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
2e970 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
2e980 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2e990 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
2e9a0 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
2e9b0 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2e9c0 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
2e9d0 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
2e9e0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
2e9f0 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
2ea00 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
2ea10 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
2ea20 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
2ea30 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
2ea40 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
2ea50 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
2ea60 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
2ea70 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
2ea80 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
2ea90 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
2eaa0 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
2eab0 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2eac0 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61  L indices.*/.sta
2ead0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65  tic int btreeCre
2eae0 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2eaf0 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2eb00 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
2eb10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2eb20 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
2eb30 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
2eb40 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
2eb50 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
2eb60 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2eb70 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66  Mutex(p) );.  if
2eb80 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2eb90 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2eba0 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2ebb0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2ebc0 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20  tion first */.  
2ebd0 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2ebe0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2ebf0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2ec00 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2ec10 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2ec20 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2ec30 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ly );..#ifdef SQ
2ec40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2ec50 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  CUUM.  rc = allo
2ec60 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2ec70 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2ec80 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69  Root, 1, 0);.  i
2ec90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2eca0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73  urn rc;.  }.#els
2ecb0 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  e.  if( pBt->aut
2ecc0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
2ecd0 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20  gno pgnoMove;   
2ece0 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67     /* Move a pag
2ecf0 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72  e here to make r
2ed00 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  oom for the root
2ed10 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  -page */.    Mem
2ed20 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b  Page *pPageMove;
2ed30 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
2ed40 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20  move to. */..   
2ed50 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e   /* Creating a n
2ed60 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f  ew table may pro
2ed70 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f  bably require mo
2ed80 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  ving an existing
2ed90 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
2eda0 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2edb0 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  r the new tables
2edc0 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63   root page. In c
2edd0 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74 75  ase this page tu
2ede0 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  rns.    ** out t
2edf0 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  o be an overflow
2ee00 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c   page, delete al
2ee10 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  l overflow page-
2ee20 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a  map caches.    *
2ee30 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63  * held by open c
2ee40 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  ursors..    */. 
2ee50 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
2ee60 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
2ee70 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  t);..    /* Read
2ee80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65   the value of me
2ee90 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64  ta[3] from the d
2eea0 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72  atabase to deter
2eeb0 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20  mine where the. 
2eec0 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
2eed0 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
2eee0 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61   should go. meta
2eef0 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65  [3] is the large
2ef00 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2ef10 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66   ** created so f
2ef20 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72  ar, so the new r
2ef30 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74  oot-page is (met
2ef40 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a  a[3]+1)..    */.
2ef50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ef60 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
2ef70 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20  4, &pgnoRoot);. 
2ef80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ef90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2efa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2efb0 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a     pgnoRoot++;..
2efc0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
2efd0 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74  oot-page may not
2efe0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e   be allocated on
2eff0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2f000 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  age, or the.    
2f010 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
2f020 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2f030 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74   while( pgnoRoot
2f040 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
2f050 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c  pBt, pgnoRoot) |
2f060 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f  |.        pgnoRo
2f070 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ot==PENDING_BYTE
2f080 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2f090 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2f0a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2f0b0 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b  ( pgnoRoot>=3 );
2f0c0 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
2f0d0 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61  e a page. The pa
2f0e0 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  ge that currentl
2f0f0 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e  y resides at pgn
2f100 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a  oRoot will.    *
2f110 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68  * be moved to th
2f120 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2f130 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c   (unless the all
2f140 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70  ocated page happ
2f150 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65  ens.    ** to re
2f160 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  side at pgnoRoot
2f170 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
2f180 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2f190 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65  Page(pBt, &pPage
2f1a0 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c  Move, &pgnoMove,
2f1b0 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20   pgnoRoot, 1);. 
2f1c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f1d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2f1e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2f1f0 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65      if( pgnoMove
2f200 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20  !=pgnoRoot ){.  
2f210 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20      /* pgnoRoot 
2f220 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
2f230 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
2f240 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
2f250 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
2f260 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d  new table (assum
2f270 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64  ing an error did
2f280 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74   not occur). But
2f290 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a   we were.      *
2f2a0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f  * allocated pgno
2f2b0 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65  Move. If require
2f2c0 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61  d (i.e. if it wa
2f2d0 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a  s not allocated.
2f2e0 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65        ** by exte
2f2f0 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c  nding the file),
2f300 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2f310 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67  e at position pg
2f320 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20  noMove.      ** 
2f330 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e  is already journ
2f340 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  aled..      */. 
2f350 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2f360 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61       Pgno iPtrPa
2f370 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61  ge;..      relea
2f380 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65  sePage(pPageMove
2f390 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76  );..      /* Mov
2f3a0 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  e the page curre
2f3b0 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ntly at pgnoRoot
2f3c0 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f   to pgnoMove. */
2f3d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2f3e0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2f3f0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
2f400 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20  pRoot, 0);.     
2f410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f420 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2f430 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2f440 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2f450 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52  apGet(pBt, pgnoR
2f460 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50  oot, &eType, &iP
2f470 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  trPage);.      i
2f480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f490 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
2f4a0 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
2f4b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
2f4c0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
2f4d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2f4e0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2f4f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2f500 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2f510 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
2f520 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AGE );.      ass
2f530 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
2f540 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20  AP_FREEPAGE );. 
2f550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f560 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
2f570 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
2f580 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f5a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2f5b0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2f5c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2f5d0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
2f5e0 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f  tePage(pBt, pRoo
2f5f0 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  t, eType, iPtrPa
2f600 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29  ge, pgnoMove, 0)
2f610 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2f620 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20  age(pRoot);..   
2f630 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65     /* Obtain the
2f640 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f   page at pgnoRoo
2f650 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72  t */.      if( r
2f660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f670 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f680 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2f690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2f6a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2f6b0 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
2f6c0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2f6d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f6e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f6f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2f700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f710 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
2f720 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
2f730 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f740 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2f750 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2f760 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f770 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
2f780 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f  else{.      pRoo
2f790 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20  t = pPageMove;. 
2f7a0 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70     } ..    /* Up
2f7b0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2f7c0 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61  -map and meta-da
2f7d0 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ta with the new 
2f7e0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
2f7f0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74  . */.    rc = pt
2f800 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2f810 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f  oRoot, PTRMAP_RO
2f820 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  OTPAGE, 0);.    
2f830 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f840 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2f850 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2f860 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
2f870 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2f880 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
2f890 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20   pgnoRoot);.    
2f8a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f8b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2f8c0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2f8d0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65   rc;.    }..  }e
2f8e0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  lse{.    rc = al
2f8f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2f900 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
2f910 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
2f920 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2f930 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2f940 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  f.  assert( sqli
2f950 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2f960 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
2f970 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ge) );.  zeroPag
2f980 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c  e(pRoot, flags |
2f990 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71   PTF_LEAF);.  sq
2f9a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2f9b0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2f9c0 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69  .  *piTable = (i
2f9d0 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72  nt)pgnoRoot;.  r
2f9e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f9f0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2fa00 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
2fa10 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
2fa20 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
2fa30 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2fa40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2fa50 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
2fa60 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
2fa70 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  = btreeCreateTab
2fa80 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66  le(p, piTable, f
2fa90 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
2faa0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2fab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2fac0 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67  *.** Erase the g
2fad0 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  iven database pa
2fae0 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63  ge and all its c
2faf0 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e  hildren.  Return
2fb00 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20  .** the page to 
2fb10 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f  the freelist..*/
2fb20 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
2fb30 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20  rDatabasePage(. 
2fb40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
2fb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fb60 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74   BTree that cont
2fb70 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a  ains the table *
2fb80 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
2fb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2fba0 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61  e number to clea
2fbb0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
2fbc0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
2fbd0 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55  Parent page.  NU
2fbe0 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  LL for the root 
2fbf0 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67  */.  int freePag
2fc00 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65  eFlag      /* De
2fc10 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66  allocate page if
2fc20 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65   true */.){.  Me
2fc30 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2fc40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
2fc50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2fc60 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ll;.  int i;..  
2fc70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2fc80 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2fc90 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2fca0 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
2fcb0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
2fcc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2fcd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2fce0 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
2fcf0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2fd00 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
2fd10 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  , pParent);.  if
2fd20 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2fd30 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2fd40 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
2fd50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
2fd60 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  +){.    pCell = 
2fd70 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2fd80 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
2fd90 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2fda0 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
2fdb0 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
2fdc0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70  t4byte(pCell), p
2fdd0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31  Page->pParent, 1
2fde0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2fdf0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2fe00 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2fe10 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
2fe20 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
2fe30 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
2fe40 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2fe50 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2fe60 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
2fe70 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
2fe80 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2fe90 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
2fea0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2feb0 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  8]), pPage->pPar
2fec0 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ent, 1);.    if(
2fed0 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2fee0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2fef0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65  ;.  }.  if( free
2ff00 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  PageFlag ){.    
2ff10 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2ff20 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  age);.  }else if
2ff30 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
2ff40 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2ff50 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b  >pDbPage))==0 ){
2ff60 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
2ff70 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
2ff80 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
2ff90 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
2ffa0 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
2ffb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2ffc0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2ffd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2ffe0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2fff0 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
30000 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
30010 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
30020 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
30030 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
30040 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
30050 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
30060 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
30070 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
30080 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
30090 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
300a0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
300b0 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
300c0 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
300d0 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
300e0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
300f0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
30100 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
30110 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
30120 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
30130 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
30140 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
30150 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
30160 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e  nt iTable){.  in
30170 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
30180 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
30190 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
301a0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
301b0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
301c0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
301d0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
301e0 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
301f0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
30200 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
30210 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ROR;.  }else if(
30220 20 28 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64   (rc = checkRead
30230 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c  Locks(p, iTable,
30240 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f   0, 1))!=SQLITE_
30250 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  OK ){.    /* not
30260 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
30270 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45  }else if( SQLITE
30280 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
30290 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69  llCursors(pBt, i
302a0 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20  Table, 0)) ){.  
302b0 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
302c0 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  do */.  }else{. 
302d0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
302e0 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28  abasePage(pBt, (
302f0 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20  Pgno)iTable, 0, 
30300 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
30310 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
30320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30330 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
30340 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
30350 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
30360 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
30370 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
30380 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
30390 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
303a0 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
303b0 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
303c0 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
303d0 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
303e0 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
303f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
30400 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
30410 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
30420 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
30430 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
30440 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
30450 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
30460 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
30470 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
30480 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
30490 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
304a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
304b0 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
304c0 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
304d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
304e0 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
304f0 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
30500 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
30510 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
30520 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
30530 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
30540 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
30550 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
30560 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
30570 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
30580 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
30590 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
305a0 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
305b0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
305c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
305d0 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
305e0 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
305f0 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
30600 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
30610 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
30620 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
30630 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
30640 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
30650 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
30660 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
30670 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
30680 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
30690 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
306a0 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
306b0 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
306c0 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
306d0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
306e0 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
306f0 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
30700 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dure..*/.static 
30710 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62  int btreeDropTab
30720 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
30730 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
30740 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
30750 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
30760 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
30770 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
30780 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
30790 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
307a0 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20  tex(p) );.  if( 
307b0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
307c0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
307d0 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
307e0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
307f0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
30800 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
30810 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
30820 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66   drop a table if
30830 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65   any cursors are
30840 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a   open on the.  *
30850 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
30860 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61   is because in a
30870 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
30880 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a  the backend may.
30890 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76    ** need to mov
308a0 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70  e another root-p
308b0 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61  age to fill a ga
308c0 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
308d0 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20  leted.  ** root 
308e0 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e  page. If an open
308f0 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e   cursor was usin
30900 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72  g this page a pr
30910 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a  oblem would .  *
30920 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20  * occur..  */.  
30930 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
30940 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
30950 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
30960 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
30970 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
30980 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
30990 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   &pPage, 0);.  i
309a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
309b0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
309c0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
309d0 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69  (p, iTable);.  i
309e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c  f( rc ){.    rel
309f0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
30a00 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
30a10 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20    }..  *piMoved 
30a20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62  = 0;..  if( iTab
30a30 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53  le>1 ){.#ifdef S
30a40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
30a50 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66  ACUUM.    rc = f
30a60 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
30a70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30a80 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20  pPage);.#else.  
30a90 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
30aa0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50  acuum ){.      P
30ab0 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b  gno maxRootPgno;
30ac0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
30ad0 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
30ae0 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67  p, 4, &maxRootPg
30af0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
30b00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30b10 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30b20 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
30b30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30b40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
30b50 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f  ( iTable==maxRoo
30b60 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  tPgno ){.       
30b70 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
30b80 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69   being dropped i
30b90 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  s the table with
30ba0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
30bb0 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
30bc0 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
30bd0 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68  database, put th
30be0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74  e root page on t
30bf0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20  he free list. . 
30c00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30c10 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
30c20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
30c30 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30c40 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
30c50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30c60 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
30c70 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
30c80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30c90 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
30ca0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
30cb0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68  does not have th
30cc0 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
30cd0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
30ce0 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
30cf0 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74  abase. So move t
30d00 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  he page that doe
30d10 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  s into the .    
30d20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20      ** gap left 
30d30 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72  by the deleted r
30d40 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20  oot-page..      
30d50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d    */.        Mem
30d60 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20  Page *pMove;.   
30d70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30d80 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
30d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
30da0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
30db0 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
30dc0 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
30dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30de0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
30df0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30e00 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
30e10 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
30e20 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50  t, pMove, PTRMAP
30e30 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54  _ROOTPAGE, 0, iT
30e40 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
30e50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d    releasePage(pM
30e60 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ove);.        if
30e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
30e90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
30ea0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
30eb0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
30ec0 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
30ed0 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
30ee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30f00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30f10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
30f20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
30f30 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
30f40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30f50 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
30f60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
30f80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
30f90 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f   }.        *piMo
30fa0 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e  ved = maxRootPgn
30fb0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
30fc0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77    /* Set the new
30fd0 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27   'max-root-page'
30fe0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61   value in the da
30ff0 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20 54  tabase header. T
31000 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  his.      ** is 
31010 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65  the old value le
31020 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65  ss one, less one
31030 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68 61   more if that ha
31040 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a  ppens to.      *
31050 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  * be a root-page
31060 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e   number, less on
31070 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20  e again if that 
31080 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
31090 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
310a0 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  E..      */.    
310b0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
310c0 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
310d0 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  otPgno==PENDING_
310e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
310f0 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
31100 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
31110 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
31120 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50  otPgno==PTRMAP_P
31130 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f  AGENO(pBt, maxRo
31140 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  otPgno) ){.     
31150 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
31160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31170 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50  assert( maxRootP
31180 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
31190 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
311a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
311b0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
311c0 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50  a(p, 4, maxRootP
311d0 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gno);.    }else{
311e0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
311f0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
31200 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31210 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
31220 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
31230 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74   /* If sqlite3Bt
31240 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73  reeDropTable was
31250 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
31260 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61  1. */.    zeroPa
31270 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e  ge(pPage, PTF_IN
31280 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b  TKEY|PTF_LEAF );
31290 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
312a0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
312b0 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e  eturn rc;  .}.in
312c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  t sqlite3BtreeDr
312d0 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
312e0 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
312f0 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
31300 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
31310 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
31320 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d   p->pBt->db = p-
31330 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  >db;.  rc = btre
31340 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54  eDropTable(p, iT
31350 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a  able, piMoved);.
31360 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
31370 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
31380 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
31390 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66  ead the meta-inf
313a0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20  ormation out of 
313b0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
313c0 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
313d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
313e0 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ee pages current
313f0 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ly in the databa
31400 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20  se.  Meta[1].** 
31410 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d  through meta[15]
31420 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66   are available f
31430 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72  or use by higher
31440 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30   layers.  Meta[0
31450 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ].** is read-onl
31460 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72  y, the others ar
31470 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a  e read/write..**
31480 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20   .** The schema 
31490 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  layer numbers me
314a0 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  ta values differ
314b0 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73  ently.  At the s
314c0 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28  chema.** layer (
314d0 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69  and the SetCooki
314e0 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65  e and ReadCookie
314f0 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75   opcodes) the nu
31500 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20  mber of.** free 
31510 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73  pages is not vis
31520 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65  ible.  So Cookie
31530 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20  [0] is the same 
31540 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69  as Meta[1]..*/.i
31550 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
31560 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  etMeta(Btree *p,
31570 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70   int idx, u32 *p
31580 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20  Meta){.  DbPage 
31590 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20  *pDbPage;.  int 
315a0 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
315b0 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68  har *pP1;.  BtSh
315c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
315d0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
315e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
315f0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
31600 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20  .  /* Reading a 
31610 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20  meta-data value 
31620 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  requires a read-
31630 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28  lock on page 1 (
31640 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74  and hence.  ** t
31650 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
31660 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20   table. We grab 
31670 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64  this lock regard
31680 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
31690 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  or.  ** not the 
316a0 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
316b0 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
316c0 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f  et (the table ro
316d0 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a  oted at page.  *
316e0 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20 61  * 1 is treated a
316f0 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
31700 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f   by queryTableLo
31710 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62  ck() and lockTab
31720 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63  le())..  */.  rc
31730 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63   = queryTableLoc
31740 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  k(p, 1, READ_LOC
31750 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
31760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
31770 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
31780 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
31790 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
317a0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
317b0 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d 20 73  <=15 );.  rc = s
317c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
317d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26  Bt->pPager, 1, &
317e0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
317f0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
31800 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
31810 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
31820 20 7d 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69   }.  pP1 = (unsi
31830 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
31840 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
31850 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65  pDbPage);.  *pMe
31860 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ta = get4byte(&p
31870 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b  P1[36 + idx*4]);
31880 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
31890 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a  nref(pDbPage);..
318a0 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75    /* If autovacu
318b0 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64  umed is disabled
318c0 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62   in this build b
318d0 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  ut we are trying
318e0 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73   to .  ** access
318f0 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64   an autovacuumed
31900 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
31910 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73  make the databas
31920 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a  e readonly. .  *
31930 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
31940 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31950 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20    if( idx==4 && 
31960 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e  *pMeta>0 ) pBt->
31970 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65  readOnly = 1;.#e
31980 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20  ndif..  /* Grab 
31990 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  the read-lock on
319a0 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63   page 1. */.  rc
319b0 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
319c0 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
319d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
319e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
319f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
31a00 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  te meta-informat
31a10 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ion back into th
31a20 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
31a30 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d  a[0] is.** read-
31a40 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74  only and may not
31a50 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a   be written..*/.
31a60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
31a70 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65  UpdateMeta(Btree
31a80 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33   *p, int idx, u3
31a90 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68  2 iMeta){.  BtSh
31aa0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
31ab0 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
31ac0 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20  har *pP1;.  int 
31ad0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
31ae0 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=1 && idx<=15 
31af0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
31b00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
31b10 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
31b20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
31b30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
31b40 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
31b50 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
31b60 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
31b70 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
31b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
31b90 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20  ->pPage1!=0 );. 
31ba0 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50     pP1 = pBt->pP
31bb0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
31bc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31bd0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
31be0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
31bf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75  E_OK ){.      pu
31c10 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
31c20 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b   idx*4], iMeta);
31c30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31c40 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31c50 20 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37        if( idx==7
31c60 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
31c70 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
31c80 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20  uum || iMeta==0 
31c90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31ca0 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69  t( iMeta==0 || i
31cb0 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Meta==1 );.     
31cc0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
31cd0 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20 20  um = iMeta;.    
31ce0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
31cf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
31d00 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
31d10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31d20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c  ** Return the fl
31d30 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20 62  ag byte at the b
31d40 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
31d50 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63 75  page that the cu
31d60 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65  rsor.** is curre
31d70 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
31d80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31d90 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75 72  BtreeFlags(BtCur
31da0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
31db0 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75   TODO: What abou
31dc0 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  t CURSOR_REQUIRE
31dd0 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62  SEEK state? Prob
31de0 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c  ably need to cal
31df0 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 43 75  l.  ** restoreCu
31e00 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68  rsorPosition() h
31e10 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50  ere..  */.  MemP
31e20 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 65  age *pPage;.  re
31e30 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
31e40 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61  ion(pCur);.  pPa
31e50 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
31e60 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
31e70 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
31e80 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
31e90 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72  pPage->pBt==pCur
31ea0 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72  ->pBt );.  retur
31eb0 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d  n pPage ? pPage-
31ec0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
31ed0 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a  rOffset] : 0;.}.
31ee0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
31ef0 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
31f00 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65  ted with a BTree
31f10 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
31f20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
31f30 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
31f40 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61  ging only..*/.Pa
31f50 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  ger *sqlite3Btre
31f60 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29  ePager(Btree *p)
31f70 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
31f80 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69  t->pPager;.}..#i
31f90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31fa0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
31fb0 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  K./*.** Append a
31fc0 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
31fd0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
31fe0 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
31ff0 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64  void checkAppend
32000 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79  Msg(.  Integrity
32010 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68  Ck *pCheck,.  ch
32020 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e  ar *zMsg1,.  con
32030 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
32040 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
32050 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21  list ap;.  if( !
32060 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20  pCheck->mxErr ) 
32070 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b  return;.  pCheck
32080 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68  ->mxErr--;.  pCh
32090 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76  eck->nErr++;.  v
320a0 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
320b0 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43 68 65  mat);.  if( pChe
320c0 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68 61 72  ck->errMsg.nChar
320d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
320e0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70  trAccumAppend(&p
320f0 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 22  Check->errMsg, "
32100 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69  \n", 1);.  }.  i
32110 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20 20 20  f( zMsg1 ){.    
32120 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
32130 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65  ppend(&pCheck->e
32140 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 2d 31  rrMsg, zMsg1, -1
32150 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
32160 56 58 50 72 69 6e 74 66 28 26 70 43 68 65 63 6b  VXPrintf(&pCheck
32170 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a 46 6f  ->errMsg, 1, zFo
32180 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
32190 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 70  end(ap);.  if( p
321a0 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6d 61  Check->errMsg.ma
321b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
321c0 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63    pCheck->malloc
321d0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
321e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
321f0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
32200 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
32210 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32220 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
32230 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74  /*.** Add 1 to t
32240 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
32250 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61 67  nt for page iPag
32260 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  e.  If this is t
32270 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66  he second.** ref
32280 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
32290 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72  ge, add an error
322a0 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68 65   message to pChe
322b0 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20  ck->zErrMsg..** 
322c0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72  Return 1 if ther
322d0 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65  e are 2 ore more
322e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
322f0 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69 66  he page and 0 if
32300 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
32310 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65 6e  he first referen
32320 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a  ce to the page..
32330 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b  **.** Also check
32340 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
32350 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e  umber is in boun
32360 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
32370 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67  t checkRef(Integ
32380 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
32390 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72 20  int iPage, char 
323a0 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66  *zContext){.  if
323b0 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
323c0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61  urn 1;.  if( iPa
323d0 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65  ge>pCheck->nPage
323e0 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20   || iPage<0 ){. 
323f0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32400 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
32410 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67  xt, "invalid pag
32420 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50  e number %d", iP
32430 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
32440 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   1;.  }.  if( pC
32450 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67  heck->anRef[iPag
32460 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65  e]==1 ){.    che
32470 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32480 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32  ck, zContext, "2
32490 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  nd reference to 
324a0 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
324b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
324c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70    }.  return  (p
324d0 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
324e0 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66  ge]++)>1;.}..#if
324f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32500 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
32510 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
32520 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
32530 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61  inter-map for pa
32540 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74  ge iChild maps t
32550 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65  o .** page iPare
32560 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65  nt, pointer type
32570 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74   ptrType. If not
32580 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f  , append an erro
32590 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20  r message.** to 
325a0 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  pCheck..*/.stati
325b0 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d  c void checkPtrm
325c0 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ap(.  IntegrityC
325d0 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20  k *pCheck,   /* 
325e0 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  Integrity check 
325f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e  context */.  Pgn
32600 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20  o iChild,       
32610 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67      /* Child pag
32620 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38  e number */.  u8
32630 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
32640 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
32650 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70   pointer map typ
32660 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72  e */.  Pgno iPar
32670 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ent,          /*
32680 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65   Expected pointe
32690 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67  r map parent pag
326a0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
326b0 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
326c0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
326d0 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65  description (use
326e0 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29  d for error msg)
326f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
32700 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79 70  .  u8 ePtrmapTyp
32710 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  e;.  Pgno iPtrma
32720 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d  pParent;..  rc =
32730 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65 63   ptrmapGet(pChec
32740 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20  k->pBt, iChild, 
32750 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69  &ePtrmapType, &i
32760 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
32770 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32780 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  OK ){.    checkA
32790 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
327a0 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c   zContext, "Fail
327b0 65 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61  ed to read ptrma
327c0 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c  p key=%d", iChil
327d0 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  d);.    return;.
327e0 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d    }..  if( ePtrm
327f0 61 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c  apType!=eType ||
32800 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d   iPtrmapParent!=
32810 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63  iParent ){.    c
32820 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32830 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
32840 0a 20 20 20 20 20 20 22 42 61 64 20 70 74 72 20  .      "Bad ptr 
32850 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64  map entry key=%d
32860 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64   expected=(%d,%d
32870 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20  ) got=(%d,%d)", 
32880 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65  .      iChild, e
32890 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65  Type, iParent, e
328a0 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72  PtrmapType, iPtr
328b0 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  mapParent);.  }.
328c0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
328d0 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
328e0 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c  ity of the freel
328f0 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65  ist or of an ove
32900 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e  rflow page list.
32910 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
32920 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
32930 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ges on the list 
32940 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  is N..*/.static 
32950 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a  void checkList(.
32960 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
32970 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67  Check,  /* Integ
32980 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f  rity checking co
32990 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
329a0 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20  sFreeList,      
329b0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66   /* True for a f
329c0 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20  reelist.  False 
329d0 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  for overflow pag
329e0 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
329f0 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  iPage,          
32a00 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
32a10 20 66 6f 72 20 66 69 72 73 74 20 70 61 67 65 20   for first page 
32a20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
32a30 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
32a40 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
32a50 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ed number of pag
32a60 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  es in the list *
32a70 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
32a80 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  xt        /* Con
32a90 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d  text for error m
32aa0 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  essages */.){.  
32ab0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70  int i;.  int exp
32ac0 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74  ected = N;.  int
32ad0 20 69 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b   iFirst = iPage;
32ae0 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20  .  while( N-- > 
32af0 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45  0 && pCheck->mxE
32b00 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65  rr ){.    DbPage
32b10 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20   *pOvflPage;.   
32b20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
32b30 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69  pOvflData;.    i
32b40 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20  f( iPage<1 ){.  
32b50 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
32b60 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
32b70 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25  ext,.         "%
32b80 64 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69  d of %d pages mi
32b90 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66  ssing from overf
32ba0 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e  low list startin
32bb0 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20  g at %d",.      
32bc0 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65      N+1, expecte
32bd0 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20  d, iFirst);.    
32be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
32bf0 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28     if( checkRef(
32c00 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
32c10 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b  Context) ) break
32c20 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
32c30 33 50 61 67 65 72 47 65 74 28 70 43 68 65 63 6b  3PagerGet(pCheck
32c40 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29  ->pPager, (Pgno)
32c50 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67  iPage, &pOvflPag
32c60 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  e) ){.      chec
32c70 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
32c80 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61  k, zContext, "fa
32c90 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65  iled to get page
32ca0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
32cb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
32cc0 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d  .    pOvflData =
32cd0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
32ce0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
32cf0 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29  tData(pOvflPage)
32d00 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65  ;.    if( isFree
32d10 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  List ){.      in
32d20 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26  t n = get4byte(&
32d30 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23  pOvflData[4]);.#
32d40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32d50 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
32d60 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
32d70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
32d80 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
32d90 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
32da0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
32db0 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
32dc0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  xt);.      }.#en
32dd0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  dif.      if( n>
32de0 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61  pCheck->pBt->usa
32df0 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b 0a 20  bleSize/4-2 ){. 
32e00 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
32e10 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
32e20 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
32e30 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61     "freelist lea
32e40 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20  f count too big 
32e50 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  on page %d", iPa
32e60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d  ge);.        N--
32e70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32e80 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
32e90 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
32ea0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
32eb0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
32ec0 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d  pOvflData[8+i*4]
32ed0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
32ee0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32ef0 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  M.          if( 
32f00 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
32f10 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
32f20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
32f30 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ap(pCheck, iFree
32f40 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
32f50 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65  EPAGE, 0, zConte
32f60 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xt);.          }
32f70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
32f80 20 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63    checkRef(pChec
32f90 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43  k, iFreePage, zC
32fa0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
32fb0 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20   }.        N -= 
32fc0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
32fd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32fe0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32ff0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
33000 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
33010 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
33020 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61  o-vacuum and iPa
33030 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  ge is not the la
33040 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  st.      ** page
33050 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   in this overflo
33060 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68  w list, check th
33070 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  at the pointer-m
33080 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20  ap entry for.   
33090 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
330a0 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65 73  ing page matches
330b0 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f   iPage..      */
330c0 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
330d0 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
330e0 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20  um && N>0 ){.   
330f0 20 20 20 20 20 69 20 3d 20 67 65 74 34 62 79 74       i = get4byt
33100 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20  e(pOvflData);.  
33110 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
33120 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52  p(pCheck, i, PTR
33130 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
33140 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
33150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
33160 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65 20  endif.    iPage 
33170 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c  = get4byte(pOvfl
33180 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
33190 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
331a0 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23  flPage);.  }.}.#
331b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
331c0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
331d0 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
331e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
331f0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
33200 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61  ** Do various sa
33210 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61  nity checks on a
33220 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20   single page of 
33230 61 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a  a tree.  Return.
33240 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74  ** the tree dept
33250 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72  h.  Root pages r
33260 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74  eturn 0.  Parent
33270 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a  s of root pages.
33280 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64  ** return 1, and
33290 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a   so forth..** .*
332a0 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61  * These checks a
332b0 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  re done:.**.**  
332c0 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72      1.  Make sur
332d0 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64  e that cells and
332e0 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e   freeblocks do n
332f0 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20  ot overlap.**   
33300 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69         but combi
33310 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ne to completely
33320 20 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e   cover the page.
33330 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b  .**  NO  2.  Mak
33340 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73  e sure cell keys
33350 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a   are in order..*
33360 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20  *  NO  3.  Make 
33370 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c  sure no key is l
33380 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
33390 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64  l to zLowerBound
333a0 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61  ..**  NO  4.  Ma
333b0 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
333c0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
333d0 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65  r equal to zUppe
333e0 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20  rBound..**      
333f0 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e  5.  Check the in
33400 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66  tegrity of overf
33410 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20  low pages..**   
33420 20 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65     6.  Recursive
33430 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65  ly call checkTre
33440 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69  ePage on all chi
33450 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37  ldren..**      7
33460 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
33470 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20  he depth of all 
33480 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20  children is the 
33490 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e  same..**      8.
334a0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
334b0 20 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73   page is at leas
334c0 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c  t 33% full or el
334d0 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  se it is.**     
334e0 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66       the root of
334f0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74   the tree..*/.st
33500 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72  atic int checkTr
33510 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72  eePage(.  Integr
33520 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
33530 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74  /* Context for t
33540 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20  he sanity check 
33550 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
33560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
33570 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
33580 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a   page to check *
33590 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
335a0 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
335b0 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68  ent page */.  ch
335c0 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ar *zParentConte
335d0 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f  xt  /* Parent co
335e0 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ntext */.){.  Me
335f0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
33600 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68  int i, rc, depth
33610 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b  , d2, pgno, cnt;
33620 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c  .  int hdr, cell
33630 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65  Start;.  int nCe
33640 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a  ll;.  u8 *data;.
33650 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
33660 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
33670 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65  e;.  char zConte
33680 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20  xt[100];.  char 
33690 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  *hit;..  sqlite3
336a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
336b0 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
336c0 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20  text, "Page %d: 
336d0 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  ", iPage);..  /*
336e0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
336f0 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f  page exists.  */
33700 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d  .  pBt = pCheck-
33710 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69  >pBt;.  usableSi
33720 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
33730 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67  Size;.  if( iPag
33740 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
33750 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28  .  if( checkRef(
33760 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
33770 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29  ParentContext) )
33780 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
33790 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
337a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
337b0 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50  (Pgno)iPage, &pP
337c0 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  age, 0))!=0 ){. 
337d0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
337e0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
337f0 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62  xt,.       "unab
33800 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70 61  le to get the pa
33810 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25  ge. error code=%
33820 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74  d", rc);.    ret
33830 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
33840 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
33850 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
33860 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20  e, pParent))!=0 
33870 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
33880 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
33890 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
338a0 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c              "sql
338b0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
338c0 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f  e() returns erro
338d0 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b  r code %d", rc);
338e0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
338f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
33900 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
33910 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74   Check out all t
33920 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  he cells..  */. 
33930 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f   depth = 0;.  fo
33940 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
33950 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d  nCell && pCheck-
33960 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  >mxErr; i++){.  
33970 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
33980 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c   int sz;.    Cel
33990 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20  lInfo info;..   
339a0 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61   /* Check payloa
339b0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  d overflow pages
339c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
339d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
339e0 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
339f0 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
33a00 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20 70        "On tree p
33a10 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20  age %d cell %d: 
33a20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20  ", iPage, i);.  
33a30 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
33a40 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20  ll(pPage,i);.   
33a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
33a60 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
33a70 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
33a80 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44      sz = info.nD
33a90 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ata;.    if( !pP
33aa0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a  age->intKey ) sz
33ab0 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20   += info.nKey;. 
33ac0 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69     assert( sz==i
33ad0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
33ae0 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e      if( sz>info.
33af0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
33b00 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20  int nPage = (sz 
33b10 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
33b20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f  usableSize - 5)/
33b30 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  (usableSize - 4)
33b40 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  ;.      Pgno pgn
33b50 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
33b60 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
33b70 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65  erflow]);.#ifnde
33b80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
33b90 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
33ba0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
33bb0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
33bc0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
33bd0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
33be0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50  AP_OVERFLOW1, iP
33bf0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
33c00 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
33c10 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70       checkList(p
33c20 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76  Check, 0, pgnoOv
33c30 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74  fl, nPage, zCont
33c40 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext);.    }..   
33c50 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79   /* Check sanity
33c60 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70   of left child p
33c70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
33c80 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
33c90 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d   ){.      pgno =
33ca0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
33cb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
33cc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
33cd0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
33ce0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
33cf0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
33d00 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
33d10 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
33d20 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
33d30 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
33d40 20 20 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54       d2 = checkT
33d50 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70  reePage(pCheck,p
33d60 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65  gno,pPage,zConte
33d70 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  xt);.      if( i
33d80 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74 68 20  >0 && d2!=depth 
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 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69  , zContext, "Chi
33dc0 6c 64 20 70 61 67 65 20 64 65 70 74 68 20 64 69  ld page depth di
33dd0 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d  ffers");.      }
33de0 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d 20 64  .      depth = d
33df0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
33e00 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
33e10 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
33e20 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
33e30 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
33e40 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73  ffset+8]);.    s
33e50 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
33e60 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
33e70 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
33e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e90 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61 74    "On page %d at
33ea0 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22 2c   right child: ",
33eb0 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66   iPage);.#ifndef
33ec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33ed0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
33ee0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
33ef0 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74  ){.      checkPt
33f00 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
33f10 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
33f20 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20   iPage, 0);.    
33f30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65  }.#endif.    che
33f40 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
33f50 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20  k, pgno, pPage, 
33f60 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  zContext);.  }. 
33f70 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
33f80 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61 67  complete coverag
33f90 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20  e of the page.  
33fa0 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  */.  data = pPag
33fb0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
33fc0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
33fd0 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c 69  et;.  hit = sqli
33fe0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
33ff0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
34000 20 20 69 66 28 20 68 69 74 3d 3d 30 20 29 7b 0a    if( hit==0 ){.
34010 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c      pCheck->mall
34020 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
34030 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
34040 74 28 68 69 74 2c 20 30 2c 20 75 73 61 62 6c 65  t(hit, 0, usable
34050 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  Size );.    mems
34060 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
34070 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
34080 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
34090 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
340a0 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
340b0 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
340c0 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
340d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
340e0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
340f0 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
34100 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
34110 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
34120 20 20 20 75 31 36 20 73 69 7a 65 20 3d 20 31 30     u16 size = 10
34130 32 34 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  24;.      int j;
34140 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 3d 75  .      if( pc<=u
34150 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
34160 20 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c       size = cell
34170 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
34180 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
34190 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 63   }.      if( (pc
341a0 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
341b0 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a  Size || pc<0 ){.
341c0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
341d0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
341e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
341f0 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
34200 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
34210 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
34220 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
34230 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
34240 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  j=pc+size-1; j>=
34250 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  pc; j--) hit[j]+
34260 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
34270 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20  .    for(cnt=0, 
34280 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  i=get2byte(&data
34290 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26  [hdr+1]); i>0 &&
342a0 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26   i<usableSize &&
342b0 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20   cnt<10000; .   
342c0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a          cnt++){.
342d0 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
342e0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
342f0 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i+2]);.      int
34300 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   j;.      if( (i
34310 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
34320 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20  Size || i<0 ){. 
34330 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
34340 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
34350 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22    .            "
34360 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
34370 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
34380 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
34390 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
343a0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
343b0 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69  j=i+size-1; j>=i
343c0 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
343d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
343e0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
343f0 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a[i]);.    }.   
34400 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c   for(i=cnt=0; i<
34410 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
34420 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b  {.      if( hit[
34430 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
34440 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65   cnt++;.      }e
34450 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31  lse if( hit[i]>1
34460 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
34470 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
34480 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  k, 0,.          
34490 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66  "Multiple uses f
344a0 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61  or byte %d of pa
344b0 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65  ge %d", i, iPage
344c0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
344d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
344e0 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74      if( cnt!=dat
344f0 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20  a[hdr+7] ){.    
34500 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34510 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
34520 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74         "Fragment
34530 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62  ed space is %d b
34540 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20  yte reported as 
34550 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a  %d on page %d",.
34560 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64            cnt, d
34570 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67  ata[hdr+7], iPag
34580 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
34590 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
345a0 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  hit);..  release
345b0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
345c0 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d  eturn depth+1;.}
345d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
345e0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
345f0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
34600 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
34610 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
34620 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
34630 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74  e does a complet
34640 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67  e check of the g
34650 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e  iven BTree file.
34660 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20    aRoot[] is.** 
34670 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65  an array of page
34680 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65  s numbers were e
34690 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ach page number 
346a0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
346b0 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20   of.** a table. 
346c0 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75   nRoot is the nu
346d0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
346e0 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  in aRoot..**.** 
346f0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
34700 20 6f 66 20 65 72 72 6f 72 20 73 65 65 6e 20 69   of error seen i
34710 6e 20 2a 70 6e 45 72 72 2e 20 20 45 78 63 65 70  n *pnErr.  Excep
34720 74 20 66 6f 72 20 73 6f 6d 65 20 6d 65 6d 6f 72  t for some memor
34730 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
34740 65 72 72 6f 72 73 2c 20 20 6e 6e 20 65 72 72 6f  errors,  nn erro
34750 72 20 6d 65 73 73 61 67 65 20 69 73 20 68 65 6c  r message is hel
34760 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
34770 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c  ined from.** mal
34780 6c 6f 63 20 69 73 20 72 65 74 75 72 6e 65 64 20  loc is returned 
34790 69 66 20 2a 70 6e 45 72 72 20 69 73 20 6e 6f 6e  if *pnErr is non
347a0 2d 7a 65 72 6f 2e 20 20 49 66 20 2a 70 6e 45 72  -zero.  If *pnEr
347b0 72 3d 3d 30 20 74 68 65 6e 20 4e 55 4c 4c 20 69  r==0 then NULL i
347c0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
347d0 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  /.char *sqlite3B
347e0 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65  treeIntegrityChe
347f0 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  ck(.  Btree *p, 
34800 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
34810 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a   to be checked *
34820 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20  /.  int *aRoot, 
34830 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66    /* An array of
34840 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62   root pages numb
34850 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75  ers for individu
34860 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e  al trees */.  in
34870 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e  t nRoot,    /* N
34880 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
34890 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20   in aRoot[] */. 
348a0 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f   int mxErr,    /
348b0 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67  * Stop reporting
348c0 20 65 72 72 6f 72 73 20 61 66 74 65 72 20 74 68   errors after th
348d0 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74  is many */.  int
348e0 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72   *pnErr    /* Wr
348f0 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  ite number of er
34900 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69  rors seen to thi
34910 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b  s variable */.){
34920 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
34930 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74  nRef;.  Integrit
34940 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74  yCk sCheck;.  Bt
34950 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
34960 3e 70 42 74 3b 0a 20 20 63 68 61 72 20 7a 45 72  >pBt;.  char zEr
34970 72 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  r[100];..  sqlit
34980 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
34990 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
349a0 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c  db;.  nRef = sql
349b0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
349c0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
349d0 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
349e0 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
349f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
34a00 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71  nErr = 1;.    sq
34a10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
34a20 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  p);.    return s
34a30 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
34a40 2c 20 22 63 61 6e 6e 6f 74 20 61 63 71 75 69 72  , "cannot acquir
34a50 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  e a read lock on
34a60 20 74 68 65 20 64 61 74 61 62 61 73 65 22 29 3b   the database");
34a70 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42  .  }.  sCheck.pB
34a80 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63  t = pBt;.  sChec
34a90 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e  k.pPager = pBt->
34aa0 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b  pPager;.  sCheck
34ab0 2e 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61  .nPage = pagerPa
34ac0 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70  gecount(sCheck.p
34ad0 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63 6b  Pager);.  sCheck
34ae0 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a  .mxErr = mxErr;.
34af0 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20    sCheck.nErr = 
34b00 30 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 61 6c 6c  0;.  sCheck.mall
34b10 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
34b20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e  *pnErr = 0;.#ifn
34b30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34b40 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
34b50 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20   pBt->nTrunc!=0 
34b60 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50  ){.    sCheck.nP
34b70 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  age = pBt->nTrun
34b80 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
34b90 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  if( sCheck.nPage
34ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  ==0 ){.    unloc
34bb0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
34bc0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
34bd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
34be0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
34bf0 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  .  sCheck.anRef 
34c00 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
34c10 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31   (sCheck.nPage+1
34c20 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e  )*sizeof(sCheck.
34c30 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69  anRef[0]) );.  i
34c40 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66  f( !sCheck.anRef
34c50 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74   ){.    unlockBt
34c60 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
34c70 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31  ;.    *pnErr = 1
34c80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
34c90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
34ca0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
34cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65  for(i=0; i<=sChe
34cc0 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20  ck.nPage; i++){ 
34cd0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
34ce0 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e  = 0; }.  i = PEN
34cf0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
34d00 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43  Bt);.  if( i<=sC
34d10 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20  heck.nPage ){.  
34d20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69    sCheck.anRef[i
34d30 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  ] = 1;.  }.  sql
34d40 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
34d50 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67 2c  (&sCheck.errMsg,
34d60 20 7a 45 72 72 2c 20 73 69 7a 65 6f 66 28 7a 45   zErr, sizeof(zE
34d70 72 72 29 2c 20 32 30 30 30 30 29 3b 0a 0a 20 20  rr), 20000);..  
34d80 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  /* Check the int
34d90 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
34da0 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68  eelist.  */.  ch
34db0 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c  eckList(&sCheck,
34dc0 20 31 2c 20 67 65 74 34 62 79 74 65 28 26 70 42   1, get4byte(&pB
34dd0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
34de0 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  [32]),.         
34df0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 42 74     get4byte(&pBt
34e00 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
34e10 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65  36]), "Main free
34e20 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20  list: ");..  /* 
34e30 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61  Check all the ta
34e40 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
34e50 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26  (i=0; i<nRoot &&
34e60 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69   sCheck.mxErr; i
34e70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f  ++){.    if( aRo
34e80 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  ot[i]==0 ) conti
34e90 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
34ea0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
34eb0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
34ec0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61  >autoVacuum && a
34ed0 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20  Root[i]>1 ){.   
34ee0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26     checkPtrmap(&
34ef0 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d  sCheck, aRoot[i]
34f00 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
34f10 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E, 0, 0);.    }.
34f20 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b  #endif.    check
34f30 54 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b  TreePage(&sCheck
34f40 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22  , aRoot[i], 0, "
34f50 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f  List of tree roo
34f60 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ts: ");.  }..  /
34f70 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72  * Make sure ever
34f80 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  y page in the fi
34f90 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  le is referenced
34fa0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  .  */.  for(i=1;
34fb0 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
34fc0 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
34fd0 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53  ; i++){.#ifdef S
34fe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
34ff0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43  ACUUM.    if( sC
35000 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30  heck.anRef[i]==0
35010 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
35020 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
35030 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73  , 0, "Page %d is
35040 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29   never used", i)
35050 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
35060 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
35070 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
35080 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20  to-vacuum, make 
35090 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63  sure no tables c
350a0 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65  ontain.    ** re
350b0 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e  ferences to poin
350c0 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20  ter-map pages.. 
350d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43     */.    if( sC
350e0 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30  heck.anRef[i]==0
350f0 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52   && .       (PTR
35100 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
35110 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61  i)!=i || !pBt->a
35120 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20  utoVacuum) ){.  
35130 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
35140 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
35150 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72  Page %d is never
35160 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20   used", i);.    
35170 7d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  }.    if( sCheck
35180 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20  .anRef[i]!=0 && 
35190 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
351a0 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d  PAGENO(pBt, i)==
351b0 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61  i && pBt->autoVa
351c0 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63  cuum) ){.      c
351d0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
351e0 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74  Check, 0, "Point
351f0 65 72 20 6d 61 70 20 70 61 67 65 20 25 64 20 69  er map page %d i
35200 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69  s referenced", i
35210 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
35220 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
35230 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69  ure this analysi
35240 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20  s did not leave 
35250 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65  any unref() page
35260 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42  s.  */.  unlockB
35270 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
35280 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d  );.  if( nRef !=
35290 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
352a0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
352b0 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  r) ){.    checkA
352c0 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
352d0 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74  , 0, .      "Out
352e0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f  standing page co
352f0 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64  unt goes from %d
35300 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68   to %d during th
35310 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20  is analysis",.  
35320 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65      nRef, sqlite
35330 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
35340 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20  Bt->pPager).    
35350 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  );.  }..  /* Cle
35360 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72  an  up and repor
35370 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  t errors..  */. 
35380 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
35390 76 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ve(p);.  sqlite3
353a0 5f 66 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52  _free(sCheck.anR
353b0 65 66 29 3b 0a 20 20 69 66 28 20 73 43 68 65 63  ef);.  if( sChec
353c0 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  k.mallocFailed )
353d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  {.    sqlite3Str
353e0 41 63 63 75 6d 52 65 73 65 74 28 26 73 43 68 65  AccumReset(&sChe
353f0 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 20 20  ck.errMsg);.    
35400 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e  *pnErr = sCheck.
35410 6e 45 72 72 2b 31 3b 0a 20 20 20 20 72 65 74 75  nErr+1;.    retu
35420 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 45  rn 0;.  }.  *pnE
35430 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72  rr = sCheck.nErr
35440 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  ;.  if( sCheck.n
35450 45 72 72 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Err==0 ) sqlite3
35460 53 74 72 41 63 63 75 6d 52 65 73 65 74 28 26 73  StrAccumReset(&s
35470 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20  Check.errMsg);. 
35480 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
35490 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 73  trAccumFinish(&s
354a0 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d  Check.errMsg);.}
354b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
354c0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
354d0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _CHECK */../*.**
354e0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
354f0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
35500 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
35510 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
35520 20 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e   The pager filen
35530 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74  ame is invariant
35540 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
35550 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e  pager is.** open
35560 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   so it is safe t
35570 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74  o access without
35580 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75   the BtShared mu
35590 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  tex..*/.const ch
355a0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
355b0 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65  GetFilename(Btre
355c0 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
355d0 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
355e0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
355f0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
35600 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
35610 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
35620 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
35630 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
35640 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
35650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35660 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  le..**.** The pa
35670 67 65 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ger directory na
35680 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
35690 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
356a0 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
356b0 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
356c0 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
356d0 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
356e0 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
356f0 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
35700 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20  etDirname(Btree 
35710 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
35720 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
35730 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
35740 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
35750 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
35760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
35770 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
35780 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
35790 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  le for this data
357a0 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e  base. The return
357b0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69  .** value of thi
357c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
357d0 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73   same regardless
357e0 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
357f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
35800 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
35810 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54   or not..**.** T
35820 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c  he pager journal
35830 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76   filename is inv
35840 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
35850 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
35860 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
35870 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
35880 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
35890 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
358a0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
358b0 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
358c0 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
358d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
358e0 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
358f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
35900 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
35910 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
35920 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
35930 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
35940 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f  *.** Copy the co
35950 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
35960 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70  f pBtFrom into p
35970 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63  BtTo.  A transac
35980 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
35990 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20  active for both 
359a0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
359b0 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54   size of file pT
359c0 6f 20 6d 61 79 20 62 65 20 72 65 64 75 63 65 64  o may be reduced
359d0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
359e0 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  on..** If anythi
359f0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74  ng goes wrong, t
35a00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
35a10 6e 20 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20  n pTo is rolled 
35a20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
35a30 73 75 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d  successful, Comm
35a40 69 74 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79  itPhaseOne() may
35a50 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54   be called on pT
35a60 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
35a70 6e 67 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ng. .** The call
35a80 65 72 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68  er should finish
35a90 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20   committing the 
35aa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70  transaction on p
35ab0 54 6f 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a  To by calling.**
35ac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
35ad0 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  mit()..*/.static
35ae0 20 69 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69   int btreeCopyFi
35af0 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42  le(Btree *pTo, B
35b00 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  tree *pFrom){.  
35b10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35b20 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20  OK;.  Pgno i;.. 
35b30 20 50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b   Pgno nFromPage;
35b40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35b50 66 20 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d  f pages in pFrom
35b60 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61   */.  Pgno nToPa
35b70 67 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ge;       /* Num
35b80 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
35b90 70 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e  pTo */.  Pgno nN
35ba0 65 77 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20  ewPage;      /* 
35bb0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
35bc0 69 6e 20 70 54 6f 20 61 66 74 65 72 20 74 68 65  in pTo after the
35bd0 20 63 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f   copy */..  Pgno
35be0 20 69 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20   iSkip;         
35bf0 2f 2a 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20  /* Pending byte 
35c00 70 61 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20  page in pTo */. 
35c10 20 69 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65   int nToPageSize
35c20 3b 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  ;    /* Page siz
35c30 65 20 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65  e of pTo in byte
35c40 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d  s */.  int nFrom
35c50 50 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61  PageSize;  /* Pa
35c60 67 65 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d  ge size of pFrom
35c70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
35c80 42 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20  BtShared *pBtTo 
35c90 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74  = pTo->pBt;.  Bt
35ca0 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20  Shared *pBtFrom 
35cb0 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
35cc0 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d  pBtTo->db = pTo-
35cd0 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e  >db;.  pBtFrom->
35ce0 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a  db = pFrom->db;.
35cf0 0a 20 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d  .  nToPageSize =
35d00 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65   pBtTo->pageSize
35d10 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  ;.  nFromPageSiz
35d20 65 20 3d 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67  e = pBtFrom->pag
35d30 65 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54  eSize;..  if( pT
35d40 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  o->inTrans!=TRAN
35d50 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d  S_WRITE || pFrom
35d60 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
35d70 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
35d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
35d90 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74  R;.  }.  if( pBt
35da0 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  To->pCursor ){. 
35db0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35dc0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54  _BUSY;.  }..  nT
35dd0 6f 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  oPage = pagerPag
35de0 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50  ecount(pBtTo->pP
35df0 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f 6d 50 61  ager);.  nFromPa
35e00 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
35e10 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61  unt(pBtFrom->pPa
35e20 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20  ger);.  iSkip = 
35e30 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35e40 45 28 70 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20  E(pBtTo);..  /* 
35e50 56 61 72 69 61 62 6c 65 20 6e 4e 65 77 50 61 67  Variable nNewPag
35e60 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
35e70 6f 66 20 70 61 67 65 73 20 72 65 71 75 69 72 65  of pages require
35e80 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 20  d to store the. 
35e90 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   ** contents of 
35ea0 70 46 72 6f 6d 20 75 73 69 6e 67 20 74 68 65 20  pFrom using the 
35eb0 63 75 72 72 65 6e 74 20 70 61 67 65 2d 73 69 7a  current page-siz
35ec0 65 20 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20  e of pTo..  */. 
35ed0 20 6e 4e 65 77 50 61 67 65 20 3d 20 28 28 69 36   nNewPage = ((i6
35ee0 34 29 6e 46 72 6f 6d 50 61 67 65 20 2a 20 28 69  4)nFromPage * (i
35ef0 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  64)nFromPageSize
35f00 20 2b 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53   + (i64)nToPageS
35f10 69 7a 65 20 2d 20 31 29 20 2f 20 0a 20 20 20 20  ize - 1) / .    
35f20 20 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69    (i64)nToPageSi
35f30 7a 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ze;..  for(i=1; 
35f40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35f50 20 28 69 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20   (i<=nToPage || 
35f60 69 3c 3d 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b  i<=nNewPage); i+
35f70 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72  +){..    /* Jour
35f80 6e 61 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nal the original
35f90 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   page..    **.  
35fa0 20 20 2a 2a 20 69 53 6b 69 70 20 69 73 20 74 68    ** iSkip is th
35fb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
35fc0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
35fd0 65 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e (PENDING_BYTE_
35fe0 50 41 47 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20  PAGE).    ** in 
35ff0 64 61 74 61 62 61 73 65 20 2a 70 54 6f 20 28 62  database *pTo (b
36000 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79 29 2e  efore the copy).
36010 20 54 68 69 73 20 70 61 67 65 20 69 73 20 6e 65   This page is ne
36020 76 65 72 20 77 72 69 74 74 65 6e 20 0a 20 20 20  ver written .   
36030 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75   ** into the jou
36040 72 6e 61 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73  rnal file. Unles
36050 73 20 69 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68  s i==iSkip or th
36060 65 20 70 61 67 65 20 77 61 73 20 6e 6f 74 0a 20  e page was not. 
36070 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e     ** present in
36080 20 70 54 6f 20 62 65 66 6f 72 65 20 74 68 65 20   pTo before the 
36090 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20  copy operation, 
360a0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 20 66  journal page i f
360b0 72 6f 6d 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a  rom pTo..    */.
360c0 20 20 20 20 69 66 28 20 69 21 3d 69 53 6b 69 70      if( i!=iSkip
360d0 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29   && i<=nToPage )
360e0 7b 0a 20 20 20 20 20 20 44 62 50 61 67 65 20 2a  {.      DbPage *
360f0 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  pDbPage = 0;.   
36100 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36110 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70  agerGet(pBtTo->p
36120 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61  Pager, i, &pDbPa
36130 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
36140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36150 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36160 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36170 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
36180 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36190 4f 4b 20 26 26 20 69 3e 6e 46 72 6f 6d 50 61 67  OK && i>nFromPag
361a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  e ){.          /
361b0 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d  * Yeah.  It seem
361c0 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20  s wierd to call 
361d0 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69 67 68  DontWrite() righ
361e0 74 20 61 66 74 65 72 20 57 72 69 74 65 28 29 2e  t after Write().
361f0 20 42 75 74 0a 20 20 20 20 20 20 20 20 20 20 2a   But.          *
36200 2a 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73  * that is becaus
36210 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  e the names of t
36220 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20  hose procedures 
36230 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a  do not exactly .
36240 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
36250 72 65 73 65 6e 74 20 77 68 61 74 20 74 68 65 79  resent what they
36260 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65   do.  Write() re
36270 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20  ally means "put 
36280 74 68 69 73 20 70 61 67 65 20 69 6e 20 74 68 65  this page in the
36290 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
362a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
362b0 6e 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69  nd mark it as di
362c0 72 74 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  rty so that it w
362d0 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20  ill be written. 
362e0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74           ** to t
362f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36300 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72   later."  DontWr
36310 69 74 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65  ite() undoes the
36320 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a   second part of.
36330 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
36340 74 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74  t and prevents t
36350 68 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  he page from bei
36360 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ng written to th
36370 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a  e database. The.
36380 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
36390 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  e is still on th
363a0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
363b0 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e 64  al, though.  And
363c0 20 74 68 61 74 20 69 73 20 74 68 65 20 0a 20 20   that is the .  
363d0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f 6c 65          ** whole
363e0 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 62   point of this b
363f0 6c 6f 63 6b 3a 20 74 6f 20 70 75 74 20 70 61 67  lock: to put pag
36400 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  es on the rollba
36410 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  ck journal. .   
36420 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
36430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36440 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
36450 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
36460 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
36470 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
36480 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
36490 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65     }..    /* Ove
364a0 72 77 72 69 74 65 20 74 68 65 20 64 61 74 61 20  rwrite the data 
364b0 69 6e 20 70 61 67 65 20 69 20 6f 66 20 74 68 65  in page i of the
364c0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
364d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
364e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d  SQLITE_OK && i!=
364f0 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77  iSkip && i<=nNew
36500 50 61 67 65 20 29 7b 0a 0a 20 20 20 20 20 20 44  Page ){..      D
36510 62 50 61 67 65 20 2a 70 54 6f 50 61 67 65 20 3d  bPage *pToPage =
36520 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
36530 33 5f 69 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20  3_int64 iOff;.. 
36540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36550 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d  3PagerGet(pBtTo-
36560 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 54 6f  >pPager, i, &pTo
36570 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
36580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36590 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
365a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
365b0 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20  (pToPage);.     
365c0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 0a 20   }..      for(. 
365d0 20 20 20 20 20 20 20 69 4f 66 66 3d 28 69 2d 31         iOff=(i-1
365e0 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a  )*nToPageSize; .
365f0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
36600 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a  TE_OK && iOff<i*
36610 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20  nToPageSize; .  
36620 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46        iOff += nF
36630 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20  romPageSize.    
36640 20 20 29 7b 0a 20 20 20 20 20 20 20 20 44 62 50    ){.        DbP
36650 61 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d  age *pFromPage =
36660 20 30 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   0;.        Pgno
36670 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e   iFrom = (iOff/n
36680 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b  FromPageSize)+1;
36690 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46  ..        if( iF
366a0 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rom==PENDING_BYT
366b0 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20  E_PAGE(pBtFrom) 
366c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
366d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
366e0 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ..        rc = s
366f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
36700 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20  BtFrom->pPager, 
36710 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67  iFrom, &pFromPag
36720 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
36730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36740 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
36750 2a 7a 54 6f 20 3d 20 73 71 6c 69 74 65 33 50 61  *zTo = sqlite3Pa
36760 67 65 72 47 65 74 44 61 74 61 28 70 54 6f 50 61  gerGetData(pToPa
36770 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ge);.          c
36780 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c  har *zFrom = sql
36790 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
367a0 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20  (pFromPage);.   
367b0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79         int nCopy
367c0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
367d0 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d   nFromPageSize>=
367e0 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20  nToPageSize ){. 
367f0 20 20 20 20 20 20 20 20 20 20 20 7a 46 72 6f 6d             zFrom
36800 20 2b 3d 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61   += ((i-1)*nToPa
36810 67 65 53 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d  geSize - ((iFrom
36820 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a  -1)*nFromPageSiz
36830 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
36840 20 6e 43 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65   nCopy = nToPage
36850 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
36860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36870 20 20 20 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72     zTo += (((iFr
36880 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53  om-1)*nFromPageS
36890 69 7a 65 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f  ize) - (i-1)*nTo
368a0 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  PageSize);.     
368b0 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e         nCopy = n
368c0 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20  FromPageSize;.  
368d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
368e0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c       memcpy(zTo,
368f0 20 7a 46 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a   zFrom, nCopy);.
36900 09 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
36910 6e 72 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b  nref(pFromPage);
36920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36930 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
36940 6f 50 61 67 65 20 29 20 73 71 6c 69 74 65 33 50  oPage ) sqlite3P
36950 61 67 65 72 55 6e 72 65 66 28 70 54 6f 50 61 67  agerUnref(pToPag
36960 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
36970 20 2f 2a 20 49 66 20 74 68 69 6e 67 73 20 68 61   /* If things ha
36980 76 65 20 77 6f 72 6b 65 64 20 73 6f 20 66 61 72  ve worked so far
36990 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
369a0 69 6c 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  ile may need to 
369b0 62 65 20 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74  be .  ** truncat
369c0 65 64 2e 20 54 68 65 20 63 6f 6d 70 6c 65 78 20  ed. The complex 
369d0 70 61 72 74 20 69 73 20 74 68 61 74 20 69 74 20  part is that it 
369e0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 74  may need to be t
369f0 72 75 6e 63 61 74 65 64 20 74 6f 0a 20 20 2a 2a  runcated to.  **
36a00 20 61 20 73 69 7a 65 20 74 68 61 74 20 69 73 20   a size that is 
36a10 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d  not an integer m
36a20 75 6c 74 69 70 6c 65 20 6f 66 20 6e 54 6f 50 61  ultiple of nToPa
36a30 67 65 53 69 7a 65 20 2d 20 74 68 65 20 63 75 72  geSize - the cur
36a40 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 73  rent.  ** page s
36a50 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
36a60 70 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  pager associated
36a70 20 77 69 74 68 20 42 2d 54 72 65 65 20 70 54 6f   with B-Tree pTo
36a80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  **.  ** For 
36a90 65 78 61 6d 70 6c 65 2c 20 73 61 79 20 74 68 65  example, say the
36aa0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54   page-size of pT
36ab0 6f 20 69 73 20 32 30 34 38 20 62 79 74 65 73 20  o is 2048 bytes 
36ac0 61 6e 64 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  and the original
36ad0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66   .  ** number of
36ae0 20 70 61 67 65 73 20 69 73 20 35 20 28 31 30 20   pages is 5 (10 
36af0 4b 42 20 66 69 6c 65 29 2e 20 49 66 20 70 46 72  KB file). If pFr
36b00 6f 6d 20 68 61 73 20 61 20 70 61 67 65 20 73 69  om has a page si
36b10 7a 65 20 6f 66 20 31 30 32 34 20 0a 20 20 2a 2a  ze of 1024 .  **
36b20 20 62 79 74 65 73 20 61 6e 64 20 39 20 70 61 67   bytes and 9 pag
36b30 65 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c  es, then the fil
36b40 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 74 72  e needs to be tr
36b50 75 6e 63 61 74 65 64 20 74 6f 20 39 4b 42 2e 0a  uncated to 9KB..
36b60 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
36b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36b80 69 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  if( nFromPageSiz
36b90 65 21 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29  e!=nToPageSize )
36ba0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
36bb0 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71  file *pFile = sq
36bc0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
36bd0 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20  BtTo->pPager);. 
36be0 20 20 20 20 20 69 36 34 20 69 53 69 7a 65 20 3d       i64 iSize =
36bf0 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53   (i64)nFromPageS
36c00 69 7a 65 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d  ize * (i64)nFrom
36c10 50 61 67 65 3b 0a 20 20 20 20 20 20 69 36 34 20  Page;.      i64 
36c20 69 4e 6f 77 20 3d 20 28 69 36 34 29 28 28 6e 54  iNow = (i64)((nT
36c30 6f 50 61 67 65 3e 6e 4e 65 77 50 61 67 65 29 3f  oPage>nNewPage)?
36c40 6e 54 6f 50 61 67 65 3a 6e 4e 65 77 50 61 67 65  nToPage:nNewPage
36c50 29 20 2a 20 28 69 36 34 29 6e 54 6f 50 61 67 65  ) * (i64)nToPage
36c60 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 69 36 34  Size; .      i64
36c70 20 69 50 65 6e 64 69 6e 67 20 3d 20 28 28 69 36   iPending = ((i6
36c80 34 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  4)PENDING_BYTE_P
36c90 41 47 45 28 70 42 74 54 6f 29 2d 31 29 20 2a 28  AGE(pBtTo)-1) *(
36ca0 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b  i64)nToPageSize;
36cb0 0a 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74  .  .      assert
36cc0 28 20 69 53 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b  ( iSize<=iNow );
36cd0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d  .  .      /* Com
36ce0 6d 69 74 20 70 68 61 73 65 20 6f 6e 65 20 73 79  mit phase one sy
36cf0 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
36d00 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
36d10 77 69 74 68 20 70 54 6f 20 0a 20 20 20 20 20 20  with pTo .      
36d20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
36d30 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 2e  e original data.
36d40 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 73 79 6e   It does not syn
36d50 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
36d60 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 73  ile.      ** its
36d70 65 6c 66 2e 20 41 66 74 65 72 20 64 6f 69 6e 67  elf. After doing
36d80 20 74 68 69 73 20 69 74 20 69 73 20 73 61 66 65   this it is safe
36d90 20 74 6f 20 75 73 65 20 4f 73 54 72 75 6e 63 61   to use OsTrunca
36da0 74 65 28 29 20 61 6e 64 20 6f 74 68 65 72 0a 20  te() and other. 
36db0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 41 50 49       ** file API
36dc0 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
36dd0 65 20 66 69 6c 65 20 64 69 72 65 63 74 6c 79 2e  e file directly.
36de0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36df0 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d  pBtTo->db = pTo-
36e00 3e 64 62 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  >db;.      rc = 
36e10 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
36e20 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 54 6f  itPhaseOne(pBtTo
36e30 2d 3e 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20  ->pPager, 0, 0, 
36e40 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53  1);.      if( iS
36e50 69 7a 65 3c 69 4e 6f 77 20 26 26 20 72 63 3d 3d  ize<iNow && rc==
36e60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36e70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36e80 33 4f 73 54 72 75 6e 63 61 74 65 28 70 46 69 6c  3OsTruncate(pFil
36e90 65 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 20  e, iSize);.     
36ea0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54   }.  .      /* T
36eb0 68 65 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 70  he loop that cop
36ec0 69 65 64 20 64 61 74 61 20 66 72 6f 6d 20 64 61  ied data from da
36ed0 74 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20  tabase pFrom to 
36ee0 70 54 6f 20 64 69 64 20 6e 6f 74 0a 20 20 20 20  pTo did not.    
36ef0 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 74 68    ** populate th
36f00 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 6f  e locking page o
36f10 66 20 64 61 74 61 62 61 73 65 20 70 54 6f 2e 20  f database pTo. 
36f20 49 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  If the page-size
36f30 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 70 46 72   of.      ** pFr
36f40 6f 6d 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  om is smaller th
36f50 61 6e 20 74 68 61 74 20 6f 66 20 70 54 6f 2c 20  an that of pTo, 
36f60 74 68 69 73 20 6d 65 61 6e 73 20 73 6f 6d 65 20  this means some 
36f70 64 61 74 61 20 77 69 6c 6c 0a 20 20 20 20 20 20  data will.      
36f80 2a 2a 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ** not have been
36f90 20 63 6f 70 69 65 64 2e 20 0a 20 20 20 20 20 20   copied. .      
36fa0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
36fb0 20 62 6c 6f 63 6b 20 63 6f 70 69 65 73 20 74 68   block copies th
36fc0 65 20 6d 69 73 73 69 6e 67 20 64 61 74 61 20 66  e missing data f
36fd0 72 6f 6d 20 64 61 74 61 62 61 73 65 20 70 46 72  rom database pFr
36fe0 6f 6d 20 74 6f 20 70 54 6f 20 0a 20 20 20 20 20  om to pTo .     
36ff0 20 2a 2a 20 75 73 69 6e 67 20 66 69 6c 65 20 41   ** using file A
37000 50 49 73 2e 20 54 68 69 73 20 69 73 20 73 61 66  PIs. This is saf
37010 65 20 62 65 63 61 75 73 65 20 61 74 20 74 68 69  e because at thi
37020 73 20 70 6f 69 6e 74 20 77 65 20 6b 6e 6f 77 20  s point we know 
37030 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c  that.      ** al
37040 6c 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  l of the origina
37050 6c 20 64 61 74 61 20 66 72 6f 6d 20 70 54 6f 20  l data from pTo 
37060 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
37070 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20  into the .      
37080 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
37090 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
370a0 74 20 77 6f 75 6c 64 20 62 65 20 73 61 66 65 20  t would be safe 
370b0 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61  to do anything a
370c0 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 74  t.      ** all t
370d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
370e0 69 6c 65 20 65 78 63 65 70 74 20 74 72 75 6e 63  ile except trunc
370f0 61 74 65 20 69 74 20 74 6f 20 7a 65 72 6f 20 62  ate it to zero b
37100 79 74 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ytes..      */. 
37110 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
37120 49 54 45 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d 50  ITE_OK && nFromP
37130 61 67 65 53 69 7a 65 3c 6e 54 6f 50 61 67 65 53  ageSize<nToPageS
37140 69 7a 65 20 26 26 20 69 53 69 7a 65 3e 69 50 65  ize && iSize>iPe
37150 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 20 20  nding){.        
37160 69 36 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  i64 iOff;.      
37170 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20    for(.         
37180 20 69 4f 66 66 3d 69 50 65 6e 64 69 6e 67 3b 20   iOff=iPending; 
37190 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53  .          rc==S
371a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66  QLITE_OK && iOff
371b0 3c 28 69 50 65 6e 64 69 6e 67 2b 6e 54 6f 50 61  <(iPending+nToPa
371c0 67 65 53 69 7a 65 29 3b 20 0a 20 20 20 20 20 20  geSize); .      
371d0 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f      iOff += nFro
371e0 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  mPageSize.      
371f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44    ){.          D
37200 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61 67 65  bPage *pFromPage
37210 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
37220 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f  Pgno iFrom = (iO
37230 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  ff/nFromPageSize
37240 29 2b 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  )+1;.  .        
37250 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e    if( iFrom==PEN
37260 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
37270 42 74 46 72 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d  BtFrom) || iFrom
37280 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20  >nFromPage ){.  
37290 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
372a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
372b0 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20    .          rc 
372c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
372d0 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
372e0 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d  r, iFrom, &pFrom
372f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
37300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37310 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
37320 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20    char *zFrom = 
37330 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
37340 61 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a  ata(pFromPage);.
37350 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
37360 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
37370 70 46 69 6c 65 2c 20 7a 46 72 6f 6d 2c 20 6e 46  pFile, zFrom, nF
37380 72 6f 6d 50 61 67 65 53 69 7a 65 2c 20 69 4f 66  romPageSize, iOf
37390 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
373a0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
373b0 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20  f(pFromPage);.  
373c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
373d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20    }.      }.  . 
373e0 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65       /* Sync the
373f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
37400 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
37410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37420 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37430 33 50 61 67 65 72 53 79 6e 63 28 70 42 74 54 6f  3PagerSync(pBtTo
37440 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
37450 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
37460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37470 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 42  PagerTruncate(pB
37480 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 4e 65  tTo->pPager, nNe
37490 77 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  wPage);.    }.  
374a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
374b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 42 74  _OK ){.      pBt
374c0 54 6f 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  To->pageSizeFixe
374d0 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 0;.    }.  }
374e0 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
374f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
37500 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d  llback(pTo);.  }
37510 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
37520 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
37530 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65  reeCopyFile(Btre
37540 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70  e *pTo, Btree *p
37550 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  From){.  int rc;
37560 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
37570 6e 74 65 72 28 70 54 6f 29 3b 0a 20 20 73 71 6c  nter(pTo);.  sql
37580 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
37590 46 72 6f 6d 29 3b 0a 20 20 72 63 20 3d 20 62 74  From);.  rc = bt
375a0 72 65 65 43 6f 70 79 46 69 6c 65 28 70 54 6f 2c  reeCopyFile(pTo,
375b0 20 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74   pFrom);.  sqlit
375c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 46 72  e3BtreeLeave(pFr
375d0 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  om);.  sqlite3Bt
375e0 72 65 65 4c 65 61 76 65 28 70 54 6f 29 3b 0a 20  reeLeave(pTo);. 
375f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
37600 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
37610 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a  OMIT_VACUUM */..
37620 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
37630 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e 73  -zero if a trans
37640 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
37650 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37660 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 42  BtreeIsInTrans(B
37670 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
37680 72 74 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69  rt( p==0 || sqli
37690 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
376a0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
376b0 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
376c0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
376d0 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a  S_WRITE));.}../*
376e0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
376f0 65 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d 65  ero if a stateme
37700 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
37710 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
37720 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
37730 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
37740 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37750 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
37760 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
37770 20 28 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70   (p->pBt && p->p
37780 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a  Bt->inStmt);.}..
37790 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
377a0 2d 7a 65 72 6f 20 69 66 20 61 20 72 65 61 64 20  -zero if a read 
377b0 28 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73  (or write) trans
377c0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
377d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
377e0 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61  BtreeIsInReadTra
377f0 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ns(Btree *p){.  
37800 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
37810 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
37820 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
37830 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69  turn (p && (p->i
37840 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
37850 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  NE));.}../*.** T
37860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
37870 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
37880 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  o a blob of memo
37890 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
378a0 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73  th.** a single s
378b0 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54 68 65  hared-btree. The
378c0 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20   memory is used 
378d0 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65 20 66  by client code f
378e0 6f 72 20 69 74 73 20 6f 77 6e 0a 2a 2a 20 70 75  or its own.** pu
378f0 72 70 6f 73 65 73 20 28 66 6f 72 20 65 78 61 6d  rposes (for exam
37900 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20 61 20  ple, to store a 
37910 68 69 67 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d  high-level schem
37920 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
37930 68 20 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64  h .** the shared
37940 2d 62 74 72 65 65 29 2e 20 54 68 65 20 62 74 72  -btree). The btr
37950 65 65 20 6c 61 79 65 72 20 6d 61 6e 61 67 65 73  ee layer manages
37960 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
37970 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a  ing issues..**.*
37980 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
37990 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
379a0 6f 6e 20 61 20 73 68 61 72 65 64 2d 62 74 72 65  on a shared-btre
379b0 65 2c 20 6e 42 79 74 65 73 20 62 79 74 65 73 20  e, nBytes bytes 
379c0 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65  of memory.** are
379d0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f   allocated, zero
379e0 65 64 2c 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ed, and returned
379f0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
37a00 46 6f 72 20 65 61 63 68 20 73 75 62 73 65 71 75  For each subsequ
37a10 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65  ent .** call the
37a20 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74 65   nBytes paramete
37a30 72 20 69 73 20 69 67 6e 6f 72 65 64 20 61 6e 64  r is ignored and
37a40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
37a50 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f  e same blob.** o
37a60 66 20 6d 65 6d 6f 72 79 20 72 65 74 75 72 6e 65  f memory returne
37a70 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  d. .**.** If the
37a80 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65 74 65   nBytes paramete
37a90 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 62  r is 0 and the b
37aa0 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 68 61  lob of memory ha
37ab0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
37ac0 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 20 6e  * allocated, a n
37ad0 75 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 72  ull pointer is r
37ae0 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
37af0 62 6c 6f 62 20 68 61 73 20 61 6c 72 65 61 64 79  blob has already
37b00 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74   been.** allocat
37b10 65 64 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  ed, it is return
37b20 65 64 20 61 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2a  ed as normal..**
37b30 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20  .** Just before 
37b40 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
37b50 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20   is closed, the 
37b60 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20  function passed 
37b70 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65  as the .** xFree
37b80 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74   argument when t
37b90 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
37ba0 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73  tion was made is
37bb0 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20   invoked on the 
37bc0 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f  .** blob of allo
37bd0 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68  cated memory. Th
37be0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
37bf0 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69  ld not call sqli
37c00 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e  te3_free().** on
37c10 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65   the memory, the
37c20 20 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65   btree layer doe
37c30 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20  s that..*/.void 
37c40 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68  *sqlite3BtreeSch
37c50 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ema(Btree *p, in
37c60 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a  t nBytes, void(*
37c70 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b  xFree)(void *)){
37c80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
37c90 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
37ca0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
37cb0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  );.  if( !pBt->p
37cc0 53 63 68 65 6d 61 20 26 26 20 6e 42 79 74 65 73  Schema && nBytes
37cd0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63   ){.    pBt->pSc
37ce0 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 4d 61  hema = sqlite3Ma
37cf0 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74 65 73 29  llocZero(nBytes)
37d00 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65  ;.    pBt->xFree
37d10 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a  Schema = xFree;.
37d20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
37d30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
37d40 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d  turn pBt->pSchem
37d50 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
37d60 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f 74 68  rn true if anoth
37d70 65 72 20 75 73 65 72 20 6f 66 20 74 68 65 20 73  er user of the s
37d80 61 6d 65 20 73 68 61 72 65 64 20 62 74 72 65 65  ame shared btree
37d90 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
37da0 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73  .** handle holds
37db0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
37dc0 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  ck on the sqlite
37dd0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a  _master table..*
37de0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
37df0 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42  eeSchemaLocked(B
37e00 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
37e10 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
37e20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
37e30 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
37e40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
37e50 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
37e60 20 28 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b   (queryTableLock
37e70 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
37e80 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c   READ_LOCK)!=SQL
37e90 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
37ea0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
37eb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37ec0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
37ed0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
37ee0 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  HE./*.** Obtain 
37ef0 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
37f00 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70  ble whose root p
37f10 61 67 65 20 69 73 20 69 54 61 62 2e 20 20 54 68  age is iTab.  Th
37f20 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77  e.** lock is a w
37f30 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73 57  rite lock if isW
37f40 72 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75 65  ritelock is true
37f50 20 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a   or a read lock.
37f60 2a 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c 73  ** if it is fals
37f70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
37f80 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28  3BtreeLockTable(
37f90 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
37fa0 61 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c 6f  ab, u8 isWriteLo
37fb0 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
37fc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
37fd0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
37fe0 20 20 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20      u8 lockType 
37ff0 3d 20 52 45 41 44 5f 4c 4f 43 4b 20 2b 20 69 73  = READ_LOCK + is
38000 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 61  WriteLock;.    a
38010 73 73 65 72 74 28 20 52 45 41 44 5f 4c 4f 43 4b  ssert( READ_LOCK
38020 2b 31 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  +1==WRITE_LOCK )
38030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
38040 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20  WriteLock==0 || 
38050 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29  isWriteLock==1 )
38060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
38070 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
38080 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
38090 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63  ock(p, iTab, loc
380a0 6b 54 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20  kType);.    if( 
380b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
380c0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
380d0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c  Table(p, iTab, l
380e0 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a  ockType);.    }.
380f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
38100 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
38110 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
38120 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
38130 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
38140 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  B./*.** Argument
38150 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61 20   pCsr must be a 
38160 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f  cursor opened fo
38170 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e 20  r writing on an 
38180 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  .** INTKEY table
38190 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
381a0 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 74  ing at a valid t
381b0 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a 20  able entry. .** 
381c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f  This function mo
381d0 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61 20  difies the data 
381e0 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
381f0 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a 2a  f that entry..**
38200 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 63   Only the data c
38210 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 20  ontent may only 
38220 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74 20  be modified, it 
38230 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a  is not possible.
38240 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
38250 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
38260 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69  ata stored..*/.i
38270 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
38280 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  utData(BtCursor 
38290 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCsr, u32 offse
382a0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
382b0 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *z){.  assert( 
382c0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
382d0 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCsr) );.  asse
382e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
382f0 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70 42 74  x_held(pCsr->pBt
38300 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
38310 29 3b 0a 20 20 61 73 73 65 72 74 28 70 43 73 72  );.  assert(pCsr
38320 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
38330 6c 65 29 3b 0a 0a 20 20 72 65 73 74 6f 72 65 43  le);..  restoreC
38340 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
38350 73 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  sr);.  assert( p
38360 43 73 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Csr->eState!=CUR
38370 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
38380 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65  );.  if( pCsr->e
38390 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
383a0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
383b0 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
383c0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
383d0 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74 69 6f  some preconditio
383e0 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61 29 20  ns: .  **   (a) 
383f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
38400 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a  en for writing,.
38410 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65 72 65    **   (b) there
38420 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b   is no read-lock
38430 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65   on the table be
38440 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  ing