/ Hex Artifact Content
Login

Artifact 54fc8950e4c292ff92bb431449a27772862feae9:


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 31 34 20 32 30 30 38 2f 30  c,v 1.514 2008/0
0190: 39 2f 31 38 20 31 38 3a 31 37 3a 30 34 20 64 61  9/18 18:17:04 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 3d 3d 70  ;.  if( pPage==p
71f0: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 72 65  Parent ){.    re
7200: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7210: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7220: 69 66 28 20 28 70 50 61 67 65 2d 3e 70 50 61 72  if( (pPage->pPar
7230: 65 6e 74 21 3d 70 50 61 72 65 6e 74 29 0a 20 20  ent!=pParent).  
7240: 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72   && (pPage->pPar
7250: 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d  ent!=0 || pPage-
7260: 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45 5f 49 53  >isInit==PAGE_IS
7270: 49 4e 49 54 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  INIT_FULL) ){.  
7280: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
7290: 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  page should neve
72a0: 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20  r change unless 
72b0: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  the file is corr
72c0: 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
72d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
72e0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
72f0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
7300: 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c  PAGE_ISINIT_FULL
7310: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7320: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 72 65  _OK;.  if( pPare
7330: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  nt!=0 ){.    pPa
7340: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ge->pParent = pP
7350: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
7360: 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
7370: 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
7380: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  }.  if( pPage->i
7390: 73 49 6e 69 74 3d 3d 50 41 47 45 5f 49 53 49 4e  sInit==PAGE_ISIN
73a0: 49 54 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 68  IT_NONE ){.    h
73b0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
73c0: 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20  ffset;.    data 
73d0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
73e0: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
73f0: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
7400: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
7410: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7420: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
7430: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
7440: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
7450: 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20  ize<=32768 );.  
7460: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
7470: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
7480: 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e - 1;.    pPage
7490: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
74a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53  .    pPage->idxS
74b0: 68 69 66 74 20 3d 20 30 3b 0a 20 20 20 20 75 73  hift = 0;.    us
74c0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
74d0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
74e0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
74f0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
7500: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
7510: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74  age->leaf;.    t
7520: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
7530: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
7540: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
7550: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
7560: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
7570: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
7580: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
7590: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
75a0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
75b0: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
75c0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
75d0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
75e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
75f0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
7600: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
7610: 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d  ==0 && pParent!=
7620: 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67  0 && pParent->pg
7630: 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  no!=1 ){.      /
7640: 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  * All pages must
7650: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
7660: 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70 74 20  ne cell, except 
7670: 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a  for root pages *
7680: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
7690: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
76a0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
76b0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
76c0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
76d0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
76e0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
76f0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
7700: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
7710: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d  a[hdr+7] + top -
7720: 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32   (cellOffset + 2
7730: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pPage->nCell);.
7740: 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20      while( pc>0 
7750: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  ){.      int nex
7760: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  t, size;.      i
7770: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
7780: 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -4 ){.        /*
7790: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
77a0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
77b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
77c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
77d0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
77e0: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
77f0: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
7800: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
7810: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
7820: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
7830: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
7840: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
7850: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
7860: 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e  must be in accen
7870: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
7880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7890: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
78a0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
78b0: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
78c0: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
78d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
78e0: 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b  ->nFree = nFree;
78f0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 3d  .    if( nFree>=
7900: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
7910: 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70 61 63      /* Free spac
7920: 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20  e cannot exceed 
7930: 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20  total page size 
7940: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
7950: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7960: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  KPT; .    }.  }.
7970: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63  .#if 0.  /* Chec
7980: 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f  k that all the o
7990: 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63 65  ffsets in the ce
79a0: 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20  ll offset array 
79b0: 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
79c0: 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d  . .  ** .  ** Om
79d0: 69 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73  itting this cons
79e0: 69 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e  istency check an
79f0: 64 20 75 73 69 6e 67 20 74 68 65 20 70 50 61 67  d using the pPag
7a00: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b  e->maskPage mask
7a10: 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  .  ** to prevent
7a20: 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65   overrunning the
7a30: 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e 20   page buffer in 
7a40: 66 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c  findCell() resul
7a50: 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35  ts in a.  ** 2.5
7a60: 25 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61  % performance ga
7a70: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20  in..  */.  {.   
7a80: 20 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20   u8 *pOff;      
7a90: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73    /* Iterator us
7aa0: 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20  ed to check all 
7ab0: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65  cell offsets are
7ac0: 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20   in range */.   
7ad0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
7ae0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
7af0: 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73  end of cell offs
7b00: 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  et array */.    
7b10: 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  u8 mask;        
7b20: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73   /* Mask of bits
7b30: 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65   that must be ze
7b40: 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c  ro in MSB of cel
7b50: 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20  l offsets */.   
7b60: 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28   mask = ~(((u8)(
7b70: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
7b80: 29 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20  ))-1);.    pEnd 
7b90: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
7ba0: 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c  et + pPage->nCel
7bb0: 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f  l*2];.    for(pO
7bc0: 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  ff=&data[cellOff
7bd0: 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64  set]; pOff!=pEnd
7be0: 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61   && !((*pOff)&ma
7bf0: 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20  sk); pOff+=2);. 
7c00: 20 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e     if( pOff!=pEn
7c10: 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
7c20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7c30: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
7c40: 0a 23 65 6e 64 69 66 0a 0a 20 20 70 50 61 67 65  .#endif..  pPage
7c50: 2d 3e 69 73 49 6e 69 74 20 3d 20 50 41 47 45 5f  ->isInit = PAGE_
7c60: 49 53 49 4e 49 54 5f 46 55 4c 4c 3b 0a 20 20 72  ISINIT_FULL;.  r
7c70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
7c90: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
7ca0: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
7cb0: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
7cc0: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
7cd0: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
7ce0: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
7cf0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7d00: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
7d10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
7d20: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7d30: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
7d40: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
7d50: 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  .  int hdr = pPa
7d60: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
7d70: 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61   int first;..  a
7d80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7d90: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
7da0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
7db0: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
7dc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7dd0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
7de0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
7df0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
7e00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7e10: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
7e20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7e30: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
7e40: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
7e50: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
7e60: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7e70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7e80: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
7e90: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65  mutex) );.  /*me
7ea0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
7eb0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
7ec0: 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20  ize - hdr);*/.  
7ed0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67  data[hdr] = flag
7ee0: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
7ef0: 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73   + 8 + 4*((flags
7f00: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a  &PTF_LEAF)==0);.
7f10: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
7f20: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
7f30: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
7f40: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7f50: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
7f60: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
7f70: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
7f80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
7f90: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
7fa0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
7fb0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
7fc0: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
7fd0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
7fe0: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
7ff0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
8000: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
8010: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
8020: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
8030: 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67  =32768 );.  pPag
8040: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
8050: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
8060: 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
8070: 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ft = 0;.  pPage-
8080: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
8090: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 50 41  age->isInit = PA
80a0: 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 3b 0a  GE_ISINIT_FULL;.
80b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
80c0: 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
80d0: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
80e0: 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
80f0: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
8100: 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
8110: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
8120: 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
8130: 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
8140: 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
8150: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
8160: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8170: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
8180: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8190: 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ra(pDbPage);.  p
81a0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
81b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
81c0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
81d0: 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
81e0: 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d  DbPage;.  pPage-
81f0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
8200: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
8210: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
8220: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
8230: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
8240: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
8250: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
8260: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
8270: 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
8280: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
8290: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
82a0: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
82b0: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  if needed..**.**
82c0: 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   If the noConten
82d0: 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  t flag is set, i
82e0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
82f0: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
8300: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
8310: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
8320: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
8330: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
8340: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
8350: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
8360: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
8370: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
8380: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
8390: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
83a0: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
83b0: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
83c0: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
83d0: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
83e0: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
83f0: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
8400: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
8410: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
8420: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
8430: 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
8440: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
8450: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
8460: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
8470: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
8480: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
8490: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
84a0: 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
84b0: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
84c0: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
84d0: 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
84e0: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
84f0: 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
8500: 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  t        /* Do n
8510: 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e  ot load page con
8520: 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  tent if true */.
8530: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
8540: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
8550: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8560: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8570: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
8580: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
8590: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
85a0: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
85b0: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e  ge**)&pDbPage, n
85c0: 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28  oContent);.  if(
85d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
85e0: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
85f0: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
8600: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
8610: 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
8620: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8630: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
8640: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8650: 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
8660: 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20  .  Or return -1 
8670: 69 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  if.** there is a
8680: 6e 79 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  ny kind of error
8690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
86a0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  pagerPagecount(P
86b0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
86c0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
86d0: 50 61 67 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Page;.  rc = sql
86e0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
86f0: 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
8700: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63  e);.  return (rc
8710: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 6e 50 61 67  ==SQLITE_OK?nPag
8720: 65 3a 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e:-1);.}../*.** 
8730: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
8740: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
8750: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
8760: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
8770: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
8780: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
8790: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
87a0: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
87b0: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
87c0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
87d0: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
87e0: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
87f0: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
8800: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
8810: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
8820: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
8830: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
8840: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
8850: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
8860: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
8870: 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
8880: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
8890: 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50  r here */.  MemP
88a0: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
88b0: 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68   /* Parent of th
88c0: 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  e page */.){.  i
88d0: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
88e0: 2a 70 44 62 50 61 67 65 3b 0a 20 20 4d 65 6d 50  *pDbPage;.  MemP
88f0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
8900: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8910: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
8920: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
8930: 74 28 20 21 70 50 61 72 65 6e 74 20 7c 7c 20 70  t( !pParent || p
8940: 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 3d 3d  Parent->isInit==
8950: 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c  PAGE_ISINIT_FULL
8960: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   );.  if( pgno==
8970: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8980: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8990: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20  KPT; .  }..  /* 
89a0: 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20  It is often the 
89b0: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61  case that the pa
89c0: 67 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c  ge we want is al
89d0: 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a  ready in cache..
89e0: 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20    ** If so, get 
89f0: 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  it directly.  Th
8a00: 69 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d  is saves us from
8a10: 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a   having to call.
8a20: 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f    ** pagerPageco
8a30: 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75  unt() to make su
8a40: 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69  re pgno is withi
8a50: 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20  n limits, which 
8a60: 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20  results.  ** in 
8a70: 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65  a measureable pe
8a80: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
8a90: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
8aa0: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
8ab0: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
8ac0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
8ad0: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
8ae0: 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20  .    /* Page is 
8af0: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
8b00: 20 2a 2f 0a 20 20 20 20 2a 70 70 50 61 67 65 20   */.    *ppPage 
8b10: 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  = pPage = btreeP
8b20: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
8b30: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
8b40: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
8b50: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
8b60: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20      /* Page not 
8b70: 69 6e 20 63 61 63 68 65 2e 20 20 41 63 71 75 69  in cache.  Acqui
8b80: 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  re it. */.    if
8b90: 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  ( pgno>pagerPage
8ba0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
8bb0: 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
8bc0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8bd0: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
8be0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
8bf0: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
8c00: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
8c10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
8c20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
8c30: 50 61 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a  Page = *ppPage;.
8c40: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
8c50: 3e 69 73 49 6e 69 74 21 3d 50 41 47 45 5f 49 53  >isInit!=PAGE_IS
8c60: 49 4e 49 54 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  INIT_FULL ){.   
8c70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8c80: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
8c90: 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e, pParent);.  }
8ca0: 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74  else if( pParent
8cb0: 20 26 26 20 28 70 50 61 67 65 3d 3d 70 50 61 72   && (pPage==pPar
8cc0: 65 6e 74 20 7c 7c 20 70 50 61 67 65 2d 3e 70 50  ent || pPage->pP
8cd0: 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 29 20  arent!=pParent) 
8ce0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
8cf0: 6f 6e 64 69 74 69 6f 6e 20 69 6e 64 69 63 61 74  ondition indicat
8d00: 65 73 20 61 20 6c 6f 6f 70 20 69 6e 20 74 68 65  es a loop in the
8d10: 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
8d20: 65 20 28 74 68 65 20 73 63 65 6e 61 72 69 6f 0a  e (the scenario.
8d30: 20 20 20 20 2a 2a 20 77 68 65 72 65 20 64 61 74      ** where dat
8d40: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
8d50: 20 68 61 73 20 63 61 75 73 65 64 20 61 20 70 61   has caused a pa
8d60: 67 65 20 74 6f 20 62 65 20 61 20 64 69 72 65 63  ge to be a direc
8d70: 74 20 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 69  t or.    ** indi
8d80: 72 65 63 74 20 64 65 73 63 65 6e 64 61 6e 74 20  rect descendant 
8d90: 6f 66 20 69 74 73 65 6c 66 29 2e 0a 20 20 20 20  of itself)..    
8da0: 2a 2f 20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  */ .    rc = SQL
8db0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8dc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
8dd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8de0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
8df0: 67 65 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65  ge);.    *ppPage
8e00: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
8e10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8e20: 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
8e30: 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
8e40: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
8e50: 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
8e60: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8e70: 42 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  BtreeGetPage..*/
8e80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
8e90: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
8ea0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
8eb0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
8ec0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
8ed0: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
8ee0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
8ef0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8f00: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
8f10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
8f20: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
8f30: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
8f40: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
8f50: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
8f60: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
8f70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8f80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8f90: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
8fa0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
8fb0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8fc0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
8fd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
8fe0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8ff0: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66  led when the ref
9000: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
9010: 20 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68   a page.** reach
9020: 65 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65  es zero.  We nee
9030: 64 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70  d to unref the p
9040: 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77  Parent pointer w
9050: 68 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70  hen that.** happ
9060: 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ens..*/.static v
9070: 6f 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74  oid pageDestruct
9080: 6f 72 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  or(DbPage *pData
9090: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
90a0: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
90b0: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
90c0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
90d0: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61  Data);.  if( pPa
90e0: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
90f0: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 21  ( pPage->isInit!
9100: 3d 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c  =PAGE_ISINIT_FUL
9110: 4c 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73  L .         || s
9120: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9130: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9140: 74 65 78 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  tex) .    );.   
9150: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
9160: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  ent ){.      Mem
9170: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20  Page *pParent = 
9180: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
9190: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
91a0: 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 50 61 67  arent->pBt==pPag
91b0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 20 20  e->pBt );.      
91c0: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
91d0: 20 30 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   0;.      releas
91e0: 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a  ePage(pParent);.
91f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
9200: 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47  age->isInit==PAG
9210: 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29 7b  E_ISINIT_FULL ){
9220: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73  .      pPage->is
9230: 49 6e 69 74 20 3d 20 50 41 47 45 5f 49 53 49 4e  Init = PAGE_ISIN
9240: 49 54 5f 44 41 54 41 3b 0a 20 20 20 20 7d 0a 20  IT_DATA;.    }. 
9250: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
9260: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
9270: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
9280: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
9290: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
92a0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
92b0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
92c0: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
92d0: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
92e0: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
92f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
9300: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
9310: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
9320: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
9330: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
9340: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
9350: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
9360: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
9370: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
9380: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
9390: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
93a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
93b0: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
93c0: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
93d0: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
93e0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
93f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
9400: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69  xtra(pData);.  i
9410: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
9420: 3d 3d 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55  ==PAGE_ISINIT_FU
9430: 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  LL ){.    assert
9440: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9450: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9460: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
9470: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
9480: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
9490: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
94a0: 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
94b0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
94c0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 50 41  Page->isInit==PA
94d0: 47 45 5f 49 53 49 4e 49 54 5f 44 41 54 41 20 29  GE_ISINIT_DATA )
94e0: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
94f0: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  nit = 0;.  }.}..
9500: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
9510: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
9520: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
9530: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
9540: 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  BtreeInvokeBusyH
9550: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
9560: 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53  g, int n){.  BtS
9570: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
9580: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
9590: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
95a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
95b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
95c0: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
95d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
95e0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
95f0: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
9600: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
9610: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
9620: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
9630: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
9640: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9650: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
9660: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
9670: 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61  NULL.** a new da
9680: 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61  tabase with a ra
9690: 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65  ndom name is cre
96a0: 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64  ated.  This rand
96b0: 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61  omly named.** da
96c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
96d0: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
96e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
96f0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
9700: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
9710: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
9720: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
9730: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
9740: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
9750: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
9760: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
9770: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
9780: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
9790: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
97a0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
97b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
97c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
97d0: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
97e0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9800: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
9810: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
9820: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
9830: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9840: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
9850: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
9860: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
9870: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
9880: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
9890: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
98a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
98b0: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
98c0: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
98d0: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
98e0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
98f0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46  ;      /* The VF
9900: 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
9910: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53  s btree */.  BtS
9920: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
9930: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
9940: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
9950: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
9960: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
9970: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
9980: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
9990: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
99a0: 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b  .  int nReserve;
99b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
99c0: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
99d0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
99e0: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
99f0: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
9a00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
9a10: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
9a20: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
9a30: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
9a40: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
9a50: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
9a60: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
9a70: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
9a80: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
9a90: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
9aa0: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
9ab0: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
9ac0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9ad0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
9ae0: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
9af0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
9b00: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
9b10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
9b20: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
9b30: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
9b40: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
9b50: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
9b60: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
9b70: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
9b80: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
9b90: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
9ba0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
9bb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9bc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
9bd0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
9be0: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
9bf0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
9c00: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
9c10: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
9c20: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
9c30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9c40: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
9c50: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
9c60: 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20  ->db = db;..#if 
9c70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9c80: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
9c90: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
9ca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
9cb0: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
9cc0: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
9cd0: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
9ce0: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
9cf0: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
9d00: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
9d10: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
9d20: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
9d30: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
9d40: 64 62 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d  db==0.   && (db-
9d50: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
9d60: 56 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a  Vtab)==0.   && z
9d70: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
9d80: 65 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20  ename[0].  ){.  
9d90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
9da0: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
9db0: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
9dc0: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
9dd0: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
9de0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
9df0: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
9e00: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
9e10: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
9e20: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
9e30: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
9e40: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
9e50: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
9e60: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
9e70: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
9e80: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66  dCache;.      if
9e90: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
9ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9eb0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
9ec0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9ed0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
9ee0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
9ef0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
9f00: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
9f10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
9f20: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
9f30: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
9f40: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
9f50: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
9f60: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
9f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9f80: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
9f90: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
9fa0: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
9fb0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
9fc0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
9fd0: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
9fe0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
9ff0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
a000: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
a010: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
a020: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
a030: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
a040: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20  pBt->pPager)).  
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
a060: 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
a070: 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
a080: 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
a090: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
a0a0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
a0b0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
a0c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a0d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
a0e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a0f0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
a100: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
a110: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
a120: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
a130: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a140: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
a150: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
a160: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
a170: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
a180: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
a190: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
a1a0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
a1b0: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
a1c0: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
a1d0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
a1e0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
a1f0: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
a200: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a210: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
a220: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
a230: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
a240: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
a250: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
a260: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
a270: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
a280: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
a290: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
a2a0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
a2b0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
a2c0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
a2d0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
a2e0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
a2f0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
a300: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
a310: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
a320: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
a330: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
a340: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
a350: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
a360: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
a370: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
a380: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
a390: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a3a0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
a3b0: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
a3c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a3d0: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
a3e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
a3f0: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
a400: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
a410: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
a420: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
a430: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
a440: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
a450: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
a460: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
a470: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
a480: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
a490: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
a4a0: 42 74 2d 3e 62 75 73 79 48 64 72 2e 78 46 75 6e  Bt->busyHdr.xFun
a4b0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a4c0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
a4d0: 72 3b 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79  r;.    pBt->busy
a4e0: 48 64 72 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a  Hdr.pArg = pBt;.
a4f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a500: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
a510: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
a520: 69 6c 65 6e 61 6d 65 2c 20 70 61 67 65 44 65 73  ilename, pageDes
a530: 74 72 75 63 74 6f 72 2c 0a 20 20 20 20 20 20 20  tructor,.       
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
a560: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b  lags, vfsFlags);
a570: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a580: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a590: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a5a0: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
a5b0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
a5c0: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
a5d0: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
a5e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a5f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
a600: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
a610: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ut;.    }.    sq
a620: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
a630: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
a640: 61 67 65 72 2c 20 26 70 42 74 2d 3e 62 75 73 79  ager, &pBt->busy
a650: 48 64 72 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  Hdr);.    p->pBt
a660: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73   = pBt;.  .    s
a670: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
a680: 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67  initer(pBt->pPag
a690: 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  er, pageReinit);
a6a0: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
a6b0: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
a6c0: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
a6d0: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
a6e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
a6f0: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
a700: 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  er);.    pBt->pa
a710: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
a720: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  e(&zDbHeader[16]
a730: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
a740: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
a750: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
a760: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
a770: 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
a780: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
a790: 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
a7a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
a7b0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
a7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
a7d0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
a7e0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
a7f0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e  >pageSize);.#ifn
a800: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a810: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
a820: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
a830: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
a840: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
a850: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
a860: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
a870: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
a880: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
a890: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
a8a0: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
a8b0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
a8c0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
a8d0: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
a8e0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
a8f0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
a900: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
a910: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
a920: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
a930: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
a940: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
a950: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
a960: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
a970: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
a980: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
a990: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
a9a0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
a9b0: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
a9c0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
a9d0: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
a9e0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
a9f0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
aa00: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
aa10: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
aa20: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
aa30: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
aa40: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
aa50: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
aa60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
aa70: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
aa80: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
aa90: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
aaa0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
aab0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
aac0: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
aad0: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
aae0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
aaf0: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
ab00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
ab10: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
ab20: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
ab30: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
ab40: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
ab50: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
ab60: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
ab70: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
ab80: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
ab90: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
aba0: 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
abb0: 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
abc0: 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
abd0: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
abe0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
abf0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
ac00: 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
ac10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
ac20: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
ac30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ac40: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
ac50: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
ac60: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
ac70: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
ac80: 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
ac90: 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
aca0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
acb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
acc0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
acd0: 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  red;.      pBt->
ace0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
acf0: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
ad00: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
ad10: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
ad20: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
ad30: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
ad40: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
ad50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
ad60: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
ad70: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
ad80: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
ad90: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
ada0: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
adb0: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
adc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
add0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
ade0: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
adf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
ae00: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
ae10: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
ae20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ae30: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
ae40: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
ae50: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
ae60: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
ae70: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
ae80: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
ae90: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
aea0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
aeb0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
aec0: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
aed0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
aee0: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
aef0: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
af00: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
af10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
af20: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
af30: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
af40: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
af50: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
af60: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
af70: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
af80: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
af90: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
afa0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
afb0: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
afc0: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
afd0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
afe0: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
aff0: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
b000: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
b010: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
b020: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
b030: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
b040: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
b050: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
b060: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
b070: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
b080: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
b090: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
b0a0: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
b0b0: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
b0c0: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
b0d0: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
b0e0: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
b0f0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
b100: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
b110: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
b120: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
b130: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
b140: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
b150: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
b160: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
b170: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
b180: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
b190: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
b1a0: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
b1b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b1c0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
b1d0: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
b1e0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
b1f0: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
b200: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
b210: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
b220: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
b230: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
b240: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
b250: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
b260: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
b270: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
b280: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
b290: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
b2a0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
b2b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b2c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
b2d0: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
b2e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
b2f0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
b300: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
b310: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b320: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
b330: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
b340: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
b350: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b360: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
b370: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
b380: 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
b390: 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
b3a0: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
b3b0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
b3c0: 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
b3d0: 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
b3e0: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
b3f0: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
b400: 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
b410: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
b420: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
b430: 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
b440: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
b450: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
b460: 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
b470: 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
b480: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
b490: 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f  CACHE.  sqlite3_
b4a0: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a  mutex *pMaster;.
b4b0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
b4c0: 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
b4d0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
b4e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
b4f0: 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
b500: 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20  x) );.  pMaster 
b510: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
b520: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
b530: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
b540: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b550: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
b560: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
b570: 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
b580: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
b590: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
b5a0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
b5b0: 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
b5c0: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
b5d0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
b5e0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
b5f0: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
b600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
b610: 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
b620: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
b630: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
b640: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
b650: 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
b660: 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
b670: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
b680: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
b690: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b6a0: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
b6b0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
b6c0: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
b6d0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
b6e0: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
b6f0: 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
b700: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
b710: 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
b720: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
b730: 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
b740: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b750: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
b760: 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
b770: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
b780: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
b790: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
b7a0: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
b7b0: 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
b7c0: 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
b7d0: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
b7e0: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
b7f0: 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
b800: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
b810: 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
b820: 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
b830: 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
b840: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
b850: 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
b860: 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Size );.  }.}../
b870: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
b880: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
b890: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
b8a0: 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
b8b0: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
b8c0: 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
b8d0: 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
b8e0: 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
b8f0: 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
b900: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
b910: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
b920: 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
b930: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
b940: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
b950: 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
b960: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
b970: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
b980: 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
b990: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
b9a0: 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
b9b0: 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
b9c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b9d0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
b9e0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
b9f0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
ba00: 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
ba10: 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d   p->db;.  pCur =
ba20: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
ba30: 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
ba40: 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
ba50: 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
ba60: 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
ba70: 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
ba80: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
ba90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
baa0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
bab0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bac0: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
bad0: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
bae0: 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
baf0: 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
bb00: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
bb10: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
bb20: 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
bb30: 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
bb40: 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
bb50: 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
bb60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
bb70: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69  lback(p);.  sqli
bb80: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
bb90: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
bba0: 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
bbb0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
bbc0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
bbd0: 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
bbe0: 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
bbf0: 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
bc00: 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
bc10: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
bc20: 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
bc30: 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
bc40: 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
bc50: 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
bc60: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
bc70: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
bc80: 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
bc90: 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
bca0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
bcb0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
bcc0: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
bcd0: 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
bce0: 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
bcf0: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
bd00: 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
bd10: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
bd20: 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
bd30: 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
bd40: 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
bd50: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
bd60: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
bd70: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
bd80: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
bd90: 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
bda0: 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
bdb0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
bdc0: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
bdd0: 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
bde0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bdf0: 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63  e3_free(pBt->pSc
be00: 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54  hema);.    freeT
be10: 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
be20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
be30: 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
be40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
be50: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
be60: 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
be70: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
be80: 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
be90: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
bea0: 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
beb0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
bec0: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
bed0: 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
bee0: 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
bef0: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
bf00: 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
bf10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
bf20: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
bf30: 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
bf40: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
bf50: 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
bf60: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
bf70: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
bf80: 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
bf90: 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
bfa0: 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
bfb0: 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
bfc0: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
bfd0: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
bfe0: 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
bff0: 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
c000: 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
c010: 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
c020: 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
c030: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
c040: 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
c050: 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
c060: 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
c070: 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
c080: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
c090: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
c0a0: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
c0b0: 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
c0c0: 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
c0d0: 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
c0e0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
c0f0: 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
c100: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
c110: 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
c120: 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
c130: 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
c140: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
c150: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
c160: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
c170: 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
c180: 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
c190: 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
c1a0: 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
c1b0: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
c1c0: 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
c1d0: 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  worry..*/.int sq
c1e0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
c1f0: 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
c200: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
c210: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
c220: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
c230: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c240: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
c250: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
c260: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
c270: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
c280: 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
c290: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
c2a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c2b0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c2c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c2d0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
c2e0: 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
c2f0: 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
c300: 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
c310: 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
c320: 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
c330: 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
c340: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
c350: 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
c360: 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
c370: 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
c380: 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
c390: 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
c3a0: 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
c3b0: 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
c3c0: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
c3d0: 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
c3e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
c3f0: 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
c400: 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
c410: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
c420: 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
c430: 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
c440: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
c450: 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
c460: 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
c470: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
c480: 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
c490: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c4a0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
c4b0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
c4c0: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72  tSafetyLevel(Btr
c4d0: 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c  ee *p, int level
c4e0: 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b  , int fullSync){
c4f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
c500: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
c510: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c520: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
c530: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
c540: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c550: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
c560: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
c570: 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c  t->pPager, level
c580: 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73  , fullSync);.  s
c590: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c5a0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
c5b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
c5c0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
c5d0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
c5e0: 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
c5f0: 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
c600: 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
c610: 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
c620: 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
c630: 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
c640: 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
c650: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
c660: 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
c670: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
c680: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
c690: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
c6a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c6b0: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
c6c0: 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
c6d0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c6e0: 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
c6f0: 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
c700: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
c710: 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
c720: 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
c730: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
c740: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c750: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
c760: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
c770: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
c780: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
c790: 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68  VACUUM)./*.** Ch
c7a0: 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
c7b0: 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
c7c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
c7d0: 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
c7e0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
c7f0: 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
c800: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
c810: 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
c820: 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
c830: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
c840: 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
c850: 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
c860: 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
c870: 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
c880: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
c890: 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
c8a0: 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
c8b0: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
c8c0: 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
c8d0: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
c8e0: 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
c8f0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
c900: 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
c910: 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
c920: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
c930: 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
c940: 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
c950: 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
c960: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
c970: 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
c980: 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
c990: 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
c9a0: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
c9b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
c9c0: 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
c9d0: 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
c9e0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
c9f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
ca00: 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
ca10: 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
ca20: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
ca30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ca40: 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
ca50: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
ca60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ca70: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
ca80: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
ca90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
caa0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
cab0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cac0: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
cad0: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
cae0: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
caf0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
cb00: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
cb10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65  ;.  }.  if( page
cb20: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
cb30: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
cb40: 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
cb50: 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
cb60: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
cb70: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
cb80: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
cb90: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
cba0: 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
cbb0: 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
cbc0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
cbd0: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
cbe0: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
cbf0: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  ce(pBt);.    rc 
cc00: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
cc10: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
cc20: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
cc30: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
cc40: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
cc50: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
cc60: 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69  nReserve;.  sqli
cc70: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
cc80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cc90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cca0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
ccb0: 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
ccc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
ccd0: 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
cce0: 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
ccf0: 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
cd00: 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ze;.}.int sqlite
cd10: 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
cd20: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
cd30: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
cd40: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
cd50: 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
cd60: 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
cd70: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
cd80: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
cd90: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
cda0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
cdb0: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
cdc0: 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
cdd0: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
cde0: 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
cdf0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
ce00: 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
ce10: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
ce20: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
ce30: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
ce40: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
ce50: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
ce60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ce70: 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
ce80: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
ce90: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
cea0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ceb0: 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
cec0: 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
ced0: 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
cee0: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
cef0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
cf00: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
cf10: 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
cf20: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cf30: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
cf40: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
cf50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
cf60: 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
cf70: 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
cf80: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
cf90: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
cfa0: 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
cfb0: 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
cfc0: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
cfd0: 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
cfe0: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
cff0: 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
d000: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
d010: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
d020: 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
d030: 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
d040: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
d050: 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
d060: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
d070: 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
d080: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
d090: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
d0a0: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
d0b0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d0c0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d0d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d0e0: 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
d0f0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
d100: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
d110: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d120: 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f    int av = (auto
d130: 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20  Vacuum?1:0);..  
d140: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
d150: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
d160: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26  >pageSizeFixed &
d170: 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56  & av!=pBt->autoV
d180: 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
d190: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
d1a0: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
d1b0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
d1c0: 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  = av;.  }.  sqli
d1d0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
d1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
d1f0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
d200: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
d210: 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
d220: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
d230: 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
d240: 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
d250: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
d260: 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
d270: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
d280: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
d290: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
d2a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d2b0: 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
d2c0: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
d2d0: 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
d2e0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
d2f0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
d300: 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
d310: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
d320: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
d330: 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
d340: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
d350: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
d360: 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
d370: 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
d380: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
d390: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
d3a0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
d3b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
d3c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
d3d0: 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
d3e0: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
d3f0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
d400: 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
d410: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
d420: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
d430: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
d440: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
d450: 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
d460: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
d470: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
d480: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
d490: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
d4a0: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
d4b0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
d4c0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
d4d0: 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
d4e0: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
d4f0: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
d500: 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
d510: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
d520: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
d530: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
d540: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
d550: 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73  int nPage;..  as
d560: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d570: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d580: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
d590: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
d5a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d5b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d5c0: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
d5d0: 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
d5e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d5f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
d600: 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
d610: 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
d620: 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
d630: 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
d640: 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
d650: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
d660: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
d670: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
d680: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
d690: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
d6a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d6b0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d6c0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73  t_failed;.  }els
d6d0: 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b  e if( nPage>0 ){
d6e0: 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a  .    int pageSiz
d6f0: 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  e;.    int usabl
d700: 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
d710: 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
d720: 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
d730: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
d740: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
d750: 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
d760: 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
d770: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d780: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
d790: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
d7a0: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
d7b0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
d7c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
d7d0: 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
d7e0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d7f0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
d800: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
d810: 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
d820: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
d830: 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
d840: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
d850: 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
d860: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
d870: 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
d880: 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
d890: 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
d8a0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
d8b0: 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
d8c0: 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
d8d0: 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
d8e0: 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
d8f0: 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
d900: 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
d910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d920: 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
d930: 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
d940: 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
d950: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
d960: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
d970: 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65     pageSize = ge
d980: 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31 36  t2byte(&page1[16
d990: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  ]);.    if( ((pa
d9a0: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
d9b0: 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69  ze)!=0 || pageSi
d9c0: 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20  ze<512 ||.      
d9d0: 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41    (SQLITE_MAX_PA
d9e0: 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26  GE_SIZE<32768 &&
d9f0: 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
da00: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a  _MAX_PAGE_SIZE).
da10: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
da20: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
da30: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
da40: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
da50: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
da60: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
da70: 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
da80: 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  ];.    if( pageS
da90: 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
daa0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
dab0: 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
dac0: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
dad0: 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
dae0: 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
daf0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
db00: 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
db10: 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
db20: 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
db30: 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
db40: 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
db50: 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
db60: 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
db70: 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
db80: 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
db90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dba0: 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
dbb0: 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
dbc0: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
dbd0: 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
dbe0: 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
dbf0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
dc00: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
dc10: 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
dc20: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
dc30: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
dc40: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
dc50: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
dc60: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
dc70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dc80: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
dc90: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
dca0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
dcb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
dcc0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
dcd0: 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
dce0: 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  500 ){.      got
dcf0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
dd00: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
dd10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
dd20: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
dd30: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
dd40: 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
dd50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
dd60: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
dd70: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
dd80: 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
dd90: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
dda0: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
ddb0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
ddc0: 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
ddd0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
dde0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
ddf0: 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
de00: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
de10: 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
de20: 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
de30: 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
de40: 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
de50: 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
de60: 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
de70: 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
de80: 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
de90: 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
dea0: 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
deb0: 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
dec0: 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
ded0: 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
dee0: 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
def0: 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
df00: 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
df10: 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
df20: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
df30: 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
df40: 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
df50: 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
df60: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
df70: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
df80: 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
df90: 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
dfa0: 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c  a 2-byte poiner,
dfb0: 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
dfc0: 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
dfd0: 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
dfe0: 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
dff0: 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
e000: 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
e010: 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
e020: 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
e030: 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
e040: 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
e050: 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
e060: 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 23;.  pBt->mi
e070: 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  nLocal = (pBt->u
e080: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
e090: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
e0a0: 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
e0b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
e0c0: 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
e0d0: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
e0e0: 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
e0f0: 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70   23;.  assert( p
e100: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
e110: 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
e120: 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
e130: 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
e140: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e150: 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
e160: 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
e170: 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
e180: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
e190: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
e1a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
e1b0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
e1c0: 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63   lockBtree() exc
e1d0: 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f  ept that it also
e1e0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
e1f0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
e200: 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63   there is lock c
e210: 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ontention..*/.st
e220: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
e230: 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65  eeWithRetry(Btre
e240: 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20  e *pRef){.  int 
e250: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e260: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e270: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
e280: 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28  x(pRef) );.  if(
e290: 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
e2a0: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
e2b0: 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
e2c0: 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
e2d0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
e2e0: 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
e2f0: 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
e300: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
e310: 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
e320: 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
e330: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
e340: 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
e350: 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
e360: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
e370: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e380: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e390: 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
e3a0: 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
e3b0: 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
e3c0: 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
e3d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
e3e0: 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
e3f0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
e400: 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
e410: 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
e420: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
e430: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
e440: 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
e450: 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
e460: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
e470: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
e480: 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
e490: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
e4a0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
e4b0: 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
e4c0: 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
e4d0: 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
e4e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
e4f0: 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
e500: 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
e510: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
e520: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
e530: 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
e540: 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
e550: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
e560: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
e570: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
e580: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
e590: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
e5a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e5b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
e5c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
e5d0: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
e5e0: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
e5f0: 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  && pBt->pCursor=
e600: 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  =0 && pBt->pPage
e610: 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  1!=0 ){.    if( 
e620: 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
e630: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
e640: 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73  )>=1 ){.      as
e650: 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
e660: 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69 66 20  1->aData );.#if 
e670: 30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  0.      if( pBt-
e680: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d  >pPage1->aData==
e690: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  0 ){.        Mem
e6a0: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42  Page *pPage = pB
e6b0: 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20  t->pPage1;.     
e6c0: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
e6d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
e6e0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
e6f0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
e700: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
e710: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
e720: 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  pgno = 1;.      
e730: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
e740: 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
e750: 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
e760: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
e770: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53   0;.    pBt->inS
e780: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 0;.  }.}..
e790: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
e7a0: 65 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ew database by i
e7b0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
e7c0: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
e7d0: 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  e.** file..*/.st
e7e0: 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
e7f0: 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
e800: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
e810: 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
e820: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
e830: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67  t rc;.  int nPag
e840: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
e850: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e860: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
e870: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e880: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
e890: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
e8a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e8b0: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e  ITE_OK || nPage>
e8c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
e8d0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  rc;.  }.  pP1 = 
e8e0: 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
e8f0: 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
e900: 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
e910: 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
e920: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
e930: 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
e940: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
e950: 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
e960: 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
e970: 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
e980: 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
e990: 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
e9a0: 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
e9b0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31  put2byte(&data[1
e9c0: 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  6], pBt->pageSiz
e9d0: 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  e);.  data[18] =
e9e0: 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
e9f0: 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d   1;.  data[20] =
ea00: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
ea10: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
ea20: 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
ea30: 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
ea40: 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
ea50: 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
ea60: 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
ea70: 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
ea80: 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
ea90: 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
eaa0: 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
eab0: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
eac0: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
ead0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
eae0: 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
eaf0: 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
eb00: 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
eb10: 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
eb20: 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
eb30: 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
eb40: 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
eb50: 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
eb60: 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
eb70: 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
eb80: 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
eb90: 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
eba0: 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
ebb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ebc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  _OK;.}../*.** At
ebd0: 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
ebe0: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
ebf0: 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
ec00: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
ec10: 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
ec20: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
ec30: 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
ec40: 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
ec50: 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
ec60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
ec70: 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
ec80: 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
ec90: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
eca0: 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
ecb0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
ecc0: 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
ecd0: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
ece0: 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
ecf0: 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
ed00: 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
ed10: 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
ed20: 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
ed30: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
ed40: 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
ed50: 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
ed60: 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
ed70: 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
ed80: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
ed90: 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
eda0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
edb0: 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
edc0: 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
edd0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
ede0: 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
edf0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
ee00: 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
ee10: 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
ee20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
ee30: 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
ee40: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
ee50: 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
ee60: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
ee70: 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
ee80: 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
ee90: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
eea0: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
eeb0: 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
eec0: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
eed0: 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
eee0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
eef0: 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
ef00: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
ef10: 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
ef20: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
ef30: 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
ef40: 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
ef50: 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
ef60: 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
ef70: 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
ef80: 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
ef90: 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
efa0: 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
efb0: 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
efc0: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
efd0: 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
efe0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
eff0: 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
f000: 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
f010: 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
f020: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
f030: 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
f040: 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
f050: 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
f060: 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
f070: 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
f080: 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
f090: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
f0a0: 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
f0b0: 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
f0c0: 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
f0d0: 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
f0e0: 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
f0f0: 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
f100: 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
f110: 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
f120: 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
f130: 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
f140: 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
f150: 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
f160: 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
f170: 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
f180: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
f190: 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
f1a0: 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
f1b0: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
f1c0: 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
f1d0: 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
f1e0: 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
f1f0: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
f200: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
f210: 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
f220: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
f230: 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
f240: 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
f250: 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
f260: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f270: 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
f280: 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
f290: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f2a0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
f2b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f2c0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
f2d0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
f2e0: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
f2f0: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
f300: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
f310: 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
f320: 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
f330: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
f340: 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
f350: 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
f360: 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
f370: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
f380: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
f390: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
f3a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
f3b0: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
f3c0: 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
f3d0: 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
f3e0: 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
f3f0: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
f400: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
f410: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
f420: 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
f430: 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
f440: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
f450: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
f460: 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
f470: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
f480: 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
f490: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
f4a0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  ..  /* If anothe
f4b0: 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
f4c0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
f4d0: 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
f4e0: 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
f4f0: 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
f500: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
f510: 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
f520: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
f530: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
f540: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
f550: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  SY..  */.  if( p
f560: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
f570: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
f580: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
f590: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
f5a0: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
f5b0: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
f5c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f5d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
f5e0: 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
f5f0: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
f600: 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
f610: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
f620: 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
f630: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
f640: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
f650: 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=p ){.        r
f660: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f670: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74 72  .        goto tr
f680: 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20  ans_begun;.     
f690: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
f6a0: 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20  dif..  do {.    
f6b0: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
f6c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  =0 ){.      do{.
f6d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63          rc = loc
f6e0: 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
f6f0: 20 20 20 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e     }while( pBt->
f700: 70 50 61 67 65 31 3d 3d 30 20 26 26 20 72 63 3d  pPage1==0 && rc=
f710: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
f720: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
f730: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
f740: 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
f750: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
f760: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f770: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
f780: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f790: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f7a0: 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
f7b0: 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
f7c0: 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  e, wrflag>1);.  
f7d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f7e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f7f0: 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
f800: 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
f810: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f820: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
f830: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f840: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
f850: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
f860: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
f870: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
f880: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
f890: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
f8a0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
f8b0: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
f8c0: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
f8d0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71   &&.          sq
f8e0: 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65  lite3BtreeInvoke
f8f0: 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2c  BusyHandler(pBt,
f900: 20 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63   0) );..  if( rc
f910: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f920: 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
f930: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
f940: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
f950: 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
f960: 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
f970: 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
f980: 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
f990: 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
f9a0: 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
f9b0: 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
f9c0: 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
f9d0: 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
f9e0: 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ns;.    }.#ifnde
f9f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
fa00: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69  ARED_CACHE.    i
fa10: 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
fa20: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
fa30: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 29 3b  t->pExclusive );
fa40: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 45 78 63  .      pBt->pExc
fa50: 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20 20 20 20  lusive = p;.    
fa60: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
fa70: 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74  rans_begun:.  bt
fa80: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
fa90: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
faa0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
fab0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  n rc;.}...#ifnde
fac0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fad0: 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
fae0: 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
faf0: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
fb00: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
fb10: 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
fb20: 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
fb30: 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
fb40: 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
fb50: 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
fb60: 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
fb70: 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
fb80: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
fb90: 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
fba0: 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
fbb0: 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
fbc0: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
fbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbf0: 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
fc00: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
fc10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fc20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fc30: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
fc40: 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
fc50: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
fc80: 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
fc90: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
fca0: 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  t;.  int isInitO
fcb0: 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
fcc0: 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  nit;.  Pgno pgno
fcd0: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
fce0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fcf0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
fd00: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
fd10: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
fd20: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
fd30: 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50  pPage, pPage->pP
fd40: 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
fd50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fd60: 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
fd70: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
fd80: 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61   }.  nCell = pPa
fd90: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
fda0: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
fdb0: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
fdc0: 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
fdd0: 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72  Page, i);..    r
fde0: 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
fdf0: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
fe00: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
fe10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fe20: 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
fe30: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
fe40: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
fe50: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
fe60: 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
fe70: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
fe80: 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ell);.      rc =
fe90: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
fea0: 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
feb0: 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
fec0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
fed0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
fee0: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
fef0: 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  s_out;.    }.  }
ff00: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
ff10: 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
ff20: 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
ff30: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
ff40: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
ff50: 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63  fset+8]);.    rc
ff60: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
ff70: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
ff80: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
ff90: 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
ffa0: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
ffb0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
ffc0: 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
ffd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ffe0: 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
fff0: 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67  Page, which is g
10000 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
10010 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f  a btree page, no
10020 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
10030 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e   page, is a poin
10040 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
10050 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  m. Modify this p
10060 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69  ointer so that i
10070 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69  t points to.** i
10080 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
10090 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
100a0 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
100b0 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  r to be modified
100c0 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  , as .** follows
100d0 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
100e0 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
100f0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
10100 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
10110 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
10120 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10130 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
10140 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
10150 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
10160 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
10170 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
10180 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
10190 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
101a0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
101b0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
101c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
101d0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
101e0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
101f0 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
10200 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
10210 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
10220 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
10240 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
10250 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
10260 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
10270 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
10280 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
10290 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
102a0 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
102b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
102c0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
102d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
102e0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
102f0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
10300 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
10310 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
10320 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
10330 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
10340 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
10350 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
10360 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
10370 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
10380 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10390 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
103a0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
103b0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
103c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
103d0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
103e0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
103f0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
10400 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ell;..    sqlite
10410 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
10420 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43  Page, 0);.    nC
10430 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
10440 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
10450 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
10460 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
10470 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
10480 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
10490 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
104a0 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
104b0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
104c0 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  o;.        sqlit
104d0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
104e0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
104f0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
10500 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
10510 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
10520 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
10530 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
10540 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b  o.iOverflow]) ){
10550 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
10560 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
10570 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
10580 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
10590 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
105a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
105b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
105c0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
105d0 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
105e0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
105f0 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
10600 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10610 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10620 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
10630 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
10640 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
10650 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
10660 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
10670 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
10680 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
10690 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
106a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
106b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
106c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
106d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
106e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
106f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
10700 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
10710 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
10720 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
10730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10740 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
10750 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
10760 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
10770 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
10780 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
10790 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
107a0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
107b0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
107c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
107d0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
107e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
107f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
10800 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
10810 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
10820 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
10830 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
10840 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
10850 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
10860 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
10870 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
10880 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
10890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
108a0 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
108b0 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
108c0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
108d0 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
108e0 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
108f0 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
10900 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
10910 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d  sCommit.){.  Mem
10920 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
10930 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
10940 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
10950 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
10960 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
10970 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
10980 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
10990 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
109a0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
109b0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
109c0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
109d0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
109e0 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
109f0 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
10a00 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
10a10 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
10a20 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
10a30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10a40 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
10a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
10a60 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
10a70 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
10a80 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
10a90 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
10aa0 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
10ab0 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
10ac0 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
10ad0 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
10ae0 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
10af0 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
10b00 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
10b10 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
10b20 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
10b30 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
10b40 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
10b50 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
10b60 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
10b70 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
10b80 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10ba0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
10bb0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
10bc0 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
10bd0 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
10be0 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
10bf0 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
10c00 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
10c10 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
10c20 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
10c30 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
10c40 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
10c50 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
10c60 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
10c70 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
10c80 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
10c90 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
10ca0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
10cb0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
10cc0 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
10cd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
10ce0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
10cf0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
10d00 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
10d10 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
10d20 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
10d30 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
10d40 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
10d50 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
10d60 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
10d70 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
10d80 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
10d90 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
10da0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
10db0 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
10dc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10dd0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10de0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
10df0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
10e00 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
10e10 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
10e20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
10e30 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
10e40 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
10e50 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
10e60 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
10e70 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20  iFreePage);.    
10e80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
10ea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10eb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
10ec0 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
10ed0 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
10ee0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
10ef0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
10f00 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
10f10 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
10f20 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
10f30 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
10f40 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
10f50 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
10f60 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
10f70 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
10f80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10f90 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
10fa0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
10fb0 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
10fc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10fd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10fe0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
10ff0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11000 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
11010 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
11020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11030 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
11040 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
11050 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11060 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
11070 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
11080 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
11090 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
110a0 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
110b0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
110c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
110d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
110e0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
110f0 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
11100 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
11110 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
11120 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
11130 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
11140 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
11150 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
11160 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
11170 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
11180 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
11190 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
111a0 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
111b0 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
111c0 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
111d0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
111e0 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
111f0 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  l,.** return SQL
11200 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
11210 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
11220 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
11230 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20   no.** point in 
11240 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
11250 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
11260 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
11270 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
11280 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75  cificly, this fu
11290 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
112a0 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
112b0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
112c0 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  so that the last
112d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
112e0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
112f0 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  se.** is no long
11300 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
11310 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72   If the nFin par
11320 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
11330 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ro, the implemen
11340 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a  tation assumes.*
11350 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  * that the calle
11360 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
11370 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
11380 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74  ep() until.** it
11390 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
113a0 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72  DONE or an error
113b0 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20  , and that nFin 
113c0 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
113d0 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61   of pages the da
113e0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
113f0 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74   contain after t
11400 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20  his .** process 
11410 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a  is complete..*/.
11420 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
11430 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
11440 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
11450 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73  in){.  Pgno iLas
11460 74 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  tPg;            
11470 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e   /* Last page in
11480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
11490 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
114a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
114b0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
114c0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
114d0 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
114e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
114f0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11500 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74 50 67  ex) );.  iLastPg
11510 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a   = pBt->nTrunc;.
11520 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30    if( iLastPg==0
11530 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20   ){.    iLastPg 
11540 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
11550 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
11560 20 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41   }..  if( !PTRMA
11570 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
11580 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
11590 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
115a0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
115b0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20   int rc;.    u8 
115c0 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
115d0 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
115e0 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
115f0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
11600 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
11610 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
11620 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73  =0 || nFin==iLas
11630 74 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74  tPg ){.      ret
11640 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
11650 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
11660 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
11670 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
11680 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
11690 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
116a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
116b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
116c0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
116d0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
116e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
116f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11710 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
11720 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
11730 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
11740 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
11750 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
11760 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
11770 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
11780 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
11790 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e   ** if nFin is n
117a0 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
117b0 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
117c0 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
117d0 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
117e0 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
117f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
11800 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
11810 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
11820 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
11830 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
11840 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
11850 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
11860 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
11870 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
11880 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
11890 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
118a0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
118b0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
118c0 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31  eePg, iLastPg, 1
118d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
118e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
118f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11900 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
11910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
11920 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
11930 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
11940 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
11950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
11960 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
11970 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
11980 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
11990 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
119a0 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
119b0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
119c0 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20  *pLastPg;..     
119d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
119e0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
119f0 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
11a00 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
11a10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11a20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11a30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
11a40 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73     /* If nFin is
11a50 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
11a60 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
11a70 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
11a80 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
11a90 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
11aa0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
11ab0 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
11ac0 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
11ad0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
11ae0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
11af0 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74  if nFin is great
11b00 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
11b10 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
11b20 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
11b30 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
11b40 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
11b50 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
11b60 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
11b70 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
11b80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20      */.      do 
11b90 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
11ba0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
11bb0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
11bc0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
11bd0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
11be0 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Pg, 0, 0);.     
11bf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11c10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
11c20 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
11c30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
11c50 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
11c60 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
11c70 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46  e( nFin!=0 && iF
11c80 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
11c90 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
11ca0 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
11cb0 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
11cc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11cd0 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50  te(pLastPg->pDbP
11ce0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
11cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11d00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
11d10 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
11d20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
11d30 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
11d40 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20  g, nFin!=0);.   
11d50 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
11d60 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
11d70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11d90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11da0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11db0 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  ..  pBt->nTrunc 
11dc0 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20  = iLastPg - 1;. 
11dd0 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72   while( pBt->nTr
11de0 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  unc==PENDING_BYT
11df0 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52  E_PAGE(pBt)||PTR
11e00 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
11e10 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a  pBt->nTrunc) ){.
11e20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d      pBt->nTrunc-
11e30 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
11e40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11e50 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
11e60 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
11e70 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
11e80 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
11e90 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
11ea0 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
11eb0 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
11ec0 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
11ed0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
11ee0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
11ef0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
11f00 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
11f10 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
11f20 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
11f30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
11f40 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
11f50 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
11f60 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51  r occured,.** SQ
11f70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
11f80 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
11f90 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
11fa0 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
11fb0 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
11fc0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
11fd0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
11fe0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11ff0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
12000 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
12010 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
12020 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
12030 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
12040 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
12050 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
12060 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
12070 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
12080 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12090 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
120a0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
120b0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
120c0 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e  Bt);.    rc = in
120d0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
120e0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
120f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12100 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12110 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12120 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
12130 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
12140 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
12150 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
12160 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72   is commited for
12170 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12180 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
12190 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
121a0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
121b0 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
121c0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
121d0 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
121e0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
121f0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
12200 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
12210 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
12220 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
12230 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
12240 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
12250 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
12260 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
12270 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
12280 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
12290 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
122a0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
122b0 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74  *pnTrunc){.  int
122c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
122d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
122e0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
122f0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
12300 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
12310 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
12320 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66  (pPager);.#endif
12330 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
12340 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12350 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12360 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
12370 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
12380 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
12390 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
123a0 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
123b0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
123c0 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Fin = 0;..    if
123d0 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30  ( pBt->nTrunc==0
123e0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
123f0 46 72 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Free;.      Pgno
12400 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20   nPtrmap;.      
12410 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
12420 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
12430 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 69 67 20        int nOrig 
12440 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
12450 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a  (pBt->pPager);..
12460 20 20 20 20 20 20 69 66 28 20 50 54 52 4d 41 50        if( PTRMAP
12470 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
12480 69 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ig) ){.        r
12490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
124a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
124b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72   }.      if( nOr
124c0 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
124d0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
124e0 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20        nOrig--;. 
124f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
12500 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
12510 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
12520 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50  a[36]);.      nP
12530 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
12540 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
12550 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70  NO(pBt, nOrig)+p
12560 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b  gsz/5)/(pgsz/5);
12570 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f  .      nFin = nO
12580 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
12590 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28  trmap;.      if(
125a0 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
125b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
125c0 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42   nFin<=PENDING_B
125d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
125e0 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b  .        nFin--;
125f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
12600 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
12610 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
12620 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
12630 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
12640 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d  {.        nFin--
12650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12660 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
12670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12680 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
12690 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
126a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
126b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
126c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
126d0 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d  (nFin==0 || pBt-
126e0 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46  >nTrunc==0 || nF
126f0 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29  in<=pBt->nTrunc)
12700 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
12710 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
12720 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 26 26  ( pBt->nTrunc &&
12730 20 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 20   nFin ){.       
12740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12750 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
12760 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
12770 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
12780 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
12790 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
127a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
127b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
127c0 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
127d0 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d     pBt->nTrunc =
127e0 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
127f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
12800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12810 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
12820 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
12830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
12840 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12850 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63   ){.    *pnTrunc
12860 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a   = pBt->nTrunc;.
12870 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
12880 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
12890 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33  t( nRef==sqlite3
128a0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
128b0 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
128c0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a  n rc;.}..#endif.
128d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
128e0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
128f0 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
12900 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
12910 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
12920 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
12930 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
12940 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
12950 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
12960 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
12970 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
12980 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
12990 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
129a0 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
129b0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
129c0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
129d0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
129e0 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
129f0 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
12a00 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
12a10 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12a20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
12a30 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
12a40 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
12a50 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
12a60 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
12a70 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
12a80 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
12a90 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
12aa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12ab0 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
12ac0 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
12ad0 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
12ae0 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
12af0 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
12b00 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
12b10 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
12b20 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
12b30 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
12b40 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
12b50 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
12b60 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
12b70 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72 20 74  eeCommit() for t
12b80 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
12b90 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
12ba0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
12bb0 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
12bc0 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
12bd0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
12be0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
12bf0 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
12c00 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
12c10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12c20 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
12c30 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
12c40 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
12c50 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
12c60 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
12c70 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
12c80 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
12c90 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
12ca0 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
12cb0 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
12cc0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12cd0 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
12ce0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
12cf0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
12d00 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
12d10 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
12d20 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
12d30 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
12d40 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
12d50 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
12d60 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
12d70 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
12d80 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
12d90 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
12da0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
12db0 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
12dc0 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
12dd0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
12de0 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
12df0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
12e00 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
12e10 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
12e20 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
12e30 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
12e40 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
12e50 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
12e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12e70 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12e80 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
12e90 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
12ea0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
12eb0 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20 30   Pgno nTrunc = 0
12ec0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
12ed0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
12ee0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
12ef0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12f00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12f10 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
12f20 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
12f30 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
12f40 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54 72  Commit(pBt, &nTr
12f50 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66 28  unc); .      if(
12f60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12f70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12f80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12f90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
12fa0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
12fb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
12fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
12fd0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
12fe0 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
12ff0 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b 0a 20 20  , nTrunc, 0);.  
13000 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13010 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
13020 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13030 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
13040 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
13050 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
13060 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13070 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
13080 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
13090 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
130a0 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
130b0 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
130c0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
130d0 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
130e0 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
130f0 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  d.** prior to ca
13100 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
13110 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
13120 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74  BtreeSync() rout
13130 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74  ine did.** all t
13140 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69  he work of writi
13150 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ng information o
13160 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66  ut to disk and f
13170 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lushing the.** c
13180 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20  ontents so that 
13190 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e  they are written
131a0 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70   onto the disk p
131b0 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69  latter.  All thi
131c0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73  s.** routine has
131d0 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65   to do is delete
131e0 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65   or truncate the
131f0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
13200 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73  l.** (which caus
13210 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
13220 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
13230 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  d drop locks..**
13240 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
13250 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
13260 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
13270 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
13280 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
13290 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
132a0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
132b0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
132c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
132d0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
132e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
132f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13300 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
13310 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13320 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
13330 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
13340 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
13350 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
13360 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13370 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
13380 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
13390 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
133a0 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
133b0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
133c0 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
133d0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
133e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
133f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
13400 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
13410 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
13420 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
13430 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
13440 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
13450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13460 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
13470 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
13480 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
134a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
134b0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
134c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
134d0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
134e0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
134f0 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  D;.    pBt->inSt
13500 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e  mt = 0;.  }.  un
13510 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29  lockAllTables(p)
13520 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
13530 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69  andle has any ki
13540 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
13550 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
13560 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
13570 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20  n.  ** count of 
13580 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
13590 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
135a0 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68  tion count reach
135b0 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74  es 0, set.  ** t
135c0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
135d0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
135e0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
135f0 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65  Unused() call be
13600 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e  low.  ** will un
13610 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
13620 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
13630 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
13640 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  E ){.    pBt->nT
13650 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
13660 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
13670 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
13680 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
13690 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
136a0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
136b0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e    /* Set the han
136c0 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61  dles current tra
136d0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
136e0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
136f0 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65   unlock.  ** the
13700 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
13710 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
13720 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
13730 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
13740 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   */.  p->inTrans
13750 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
13760 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
13770 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74  used(pBt);..  bt
13780 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
13790 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
137a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
137b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
137c0 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
137d0 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
137e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
137f0 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
13800 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13810 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13820 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
13830 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
13840 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
13850 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
13860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
13870 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
13880 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b  mmitPhaseTwo(p);
13890 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
138a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
138b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
138c0 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
138d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
138e0 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72  ber of write-cur
138f0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
13900 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69  s handle. This i
13910 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
13920 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
13930 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
13940 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
13950 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
13960 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
13970 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
13980 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
13990 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  , a write-cursor
139a0 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
139b0 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
139c0 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20  e of writing to 
139d0 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68  the databse.  Th
139e0 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72  at means the cur
139f0 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69  sor was.** origi
13a00 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  nally opened for
13a10 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65   writing and the
13a20 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20   cursor has not 
13a30 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62  be disabled.** b
13a40 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61  y having its sta
13a50 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55  te changed to CU
13a60 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73  RSOR_FAULT..*/.s
13a70 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57  tatic int countW
13a80 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68  riteCursors(BtSh
13a90 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
13aa0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
13ab0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
13ac0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
13ad0 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
13ae0 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
13af0 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61   if( pCur->wrFla
13b00 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  g && pCur->eStat
13b10 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
13b20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
13b30 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
13b40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
13b50 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
13b60 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
13b70 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
13b80 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
13b90 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
13ba0 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65  ursor on BtShare
13bb0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
13bc0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
13bd0 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
13be0 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  is tripped, incl
13bf0 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68  uding cursors th
13c00 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  at belong.** to 
13c10 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
13c20 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
13c30 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61  happen to be sha
13c40 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68  ring.** the cach
13c50 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
13c60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13c70 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
13c80 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
13c90 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72  curs..** All cur
13ca0 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73  sors using the s
13cb0 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62  ame cache must b
13cc0 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20  e tripped.** to 
13cd0 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
13ce0 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  m trying to use 
13cf0 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a  the btree after.
13d00 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ** the rollback.
13d10 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d    The rollback m
13d20 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20  ay have deleted 
13d30 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76  tables.** or mov
13d40 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73  ed root pages, s
13d50 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
13d60 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76  icient to.** sav
13d70 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
13d80 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
13d90 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a  cursor must be.*
13da0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  * invalidated..*
13db0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
13dc0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
13dd0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
13de0 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20   int errCode){. 
13df0 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
13e00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13e10 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72  r(pBtree);.  for
13e20 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
13e30 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
13e40 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6c 65  >pNext){.    cle
13e50 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
13e60 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
13e70 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
13e80 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d  T;.    p->skip =
13e90 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20   errCode;.  }.  
13ea0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13eb0 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
13ec0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
13ed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
13ee0 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
13ef0 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
13f00 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
13f10 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
13f20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
13f30 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
13f40 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
13f50 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13f60 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
13f70 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
13f80 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
13f90 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
13fa0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
13fb0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
13fc0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
13fd0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
13fe0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
13ff0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
14000 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
14010 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14020 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
14030 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
14040 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14050 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
14060 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
14070 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14080 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
14090 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73 61  p->db;.  rc = sa
140a0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
140b0 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
140c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
140d0 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
140e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
140f0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
14100 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
14110 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
14120 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
14130 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20  cured whilst.   
14140 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61   ** trying to sa
14150 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  ve cursor positi
14160 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ons. If this is 
14170 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c  an automatic rol
14180 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a  lback (as.    **
14190 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61   the result of a
141a0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c   constraint, mal
141b0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72  loc() failure or
141c0 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20   IO error) then 
141d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68  .    ** the cach
141e0 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61  e may be interna
141f0 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lly inconsistent
14200 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61   (not contain va
14210 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20  lid trees) so.  
14220 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73    ** we cannot s
14230 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65  imply return the
14240 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61   error to the ca
14250 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61  ller. Instead, a
14260 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c  bort .    ** all
14270 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61   queries that ma
14280 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f  y be using any o
14290 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
142a0 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76  at failed to sav
142b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
142c0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
142d0 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b  lCursors(p, rc);
142e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
142f0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14300 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
14310 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  es(p);..  if( p-
14320 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
14330 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
14340 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53   rc2;..#ifndef S
14350 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14360 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e  ACUUM.    pBt->n
14370 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69  Trunc = 0;.#endi
14380 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  f..    assert( T
14390 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
143a0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
143b0 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
143c0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
143d0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
143e0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
143f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
14400 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
14410 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
14420 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
14430 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
14440 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
14450 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
14460 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
14470 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
14480 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
14490 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
144a0 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
144b0 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
144c0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
144d0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
144e0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
144f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14500 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
14510 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
14520 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
14530 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
14540 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
14550 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
14560 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
14570 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
14580 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
14590 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
145a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
145b0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
145c0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
145d0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
145e0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
145f0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14600 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
14610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
14620 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
14630 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
14640 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
14650 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
14660 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
14670 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
14680 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14690 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
146a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
146b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
146c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
146d0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
146e0 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72   can.** can be r
146f0 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70  olled back indep
14700 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
14710 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
14720 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74  ..** You must st
14730 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
14740 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  n before startin
14750 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
14760 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72  on..** The subtr
14770 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
14780 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
14790 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
147a0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d  nsaction.** comm
147b0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
147c0 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e  k..**.** Only on
147d0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
147e0 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61   may be active a
147f0 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73  t a time.  It is
14800 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79   an error to try
14810 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e  .** to start a n
14820 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ew subtransactio
14830 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62  n if another sub
14840 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14850 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
14860 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
14870 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
14880 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
14890 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
148a0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
148b0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
148c0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
148d0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
148e0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
148f0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
14900 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
14910 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
14920 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
14930 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
14940 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
14950 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
14960 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
14970 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
14980 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14990 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
149a0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
149b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
149c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
149d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
149e0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
149f0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ->db;.  if( (p->
14a00 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
14a10 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e  RITE) || pBt->in
14a20 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  Stmt ){.    rc =
14a30 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
14a40 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
14a50 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
14a60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14a70 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
14a80 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
14a90 57 52 49 54 45 20 29 3b 0a 20 20 20 20 72 63 20  WRITE );.    rc 
14aa0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
14ab0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
14ac0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
14ad0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29  gin(pBt->pPager)
14ae0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
14af0 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 1;.  }.  sql
14b00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14b10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14b20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
14b30 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75   the statment su
14b40 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72  btransaction cur
14b50 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
14b60 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ss.  If no.** su
14b70 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
14b80 61 63 74 69 76 65 2c 20 74 68 69 73 20 69 73 20  active, this is 
14b90 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
14ba0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
14bb0 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  itStmt(Btree *p)
14bc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
14bd0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14be0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
14bf0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14c00 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
14c10 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
14c20 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
14c30 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
14c40 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
14c50 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61  tCommit(pBt->pPa
14c60 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
14c70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14c80 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e  K;.  }.  pBt->in
14c90 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Stmt = 0;.  sqli
14ca0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14cb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14cc0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
14cd0 20 74 68 65 20 61 63 74 69 76 65 20 73 74 61 74   the active stat
14ce0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
14cf0 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62  tion.  If no sub
14d00 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
14d10 73 20 61 63 74 69 76 65 20 74 68 69 73 20 72 6f  s active this ro
14d20 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
14d30 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  ..**.** All curs
14d40 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
14d50 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
14d60 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
14d70 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73  attempt.** to us
14d80 65 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  e a cursor that 
14d90 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
14da0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
14db0 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77  s operation.** w
14dc0 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
14dd0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
14de0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
14df0 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ackStmt(Btree *p
14e00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14e10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
14e20 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14e30 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
14e40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
14e50 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
14e60 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
14e70 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
14e80 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
14e90 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
14ea0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
14eb0 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  er);.    pBt->in
14ec0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
14ed0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14ee0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14ef0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
14f00 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
14f10 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
14f20 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
14f30 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
14f40 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61  e.  The act of a
14f50 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f  cquiring a curso
14f60 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f  r gets a read lo
14f70 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
14f80 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
14f90 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
14fa0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
14fb0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
14fc0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
14fd0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
14fe0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
14ff0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
15000 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
15010 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
15020 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
15030 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
15040 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
15050 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
15060 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
15070 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
15080 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
15090 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
150a0 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
150b0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
150c0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
150d0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
150e0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
150f0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
15100 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
15110 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
15120 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
15130 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
15140 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
15150 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
15160 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
15170 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
15180 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
15190 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
151a0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
151b0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
151c0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
151d0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
151e0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
151f0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
15200 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
15210 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
15220 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
15230 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
15240 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
15250 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
15260 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
15270 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
15280 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
15290 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
152a0 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
152b0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
152c0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
152d0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
152e0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
152f0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
15300 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
15310 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
15320 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
15330 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
15340 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
15350 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
15380 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
15390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
153b0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
153c0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
153d0 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153f0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
15400 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
15410 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
15420 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15440 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
15450 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
15460 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
15470 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15490 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
154a0 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ursor */.){.  in
154b0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
154c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
154d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
154e0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
154f0 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 77 72  x(p) );.  if( wr
15500 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
15510 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
15520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15530 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
15540 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
15550 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
15560 54 61 62 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a  Table, 0, 0) ){.
15570 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15580 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
15590 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
155a0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
155b0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
155c0 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20  eWithRetry(p);. 
155d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
155e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
155f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15600 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
15610 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29  Only && wrFlag )
15620 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15630 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
15640 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
15650 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
15660 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28  no)iTable;.  if(
15670 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70 61   iTable==1 && pa
15680 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
15690 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  ->pPager)==0 ){.
156a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
156b0 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
156c0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
156d0 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
156e0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
156f0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
15700 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70  noRoot, &pCur->p
15710 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
15720 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15730 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
15740 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
15750 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
15760 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
15770 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
15780 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
15790 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
157a0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
157b0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
157c0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
157d0 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
157e0 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
157f0 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
15800 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
15810 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
15820 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
15830 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
15840 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
15850 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
15860 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46  ur->wrFlag = wrF
15870 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
15880 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
15890 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
158a0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
158b0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
158c0 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
158d0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
158e0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
158f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
15900 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  D;..  return SQL
15910 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f  ITE_OK;..create_
15920 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
15930 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
15940 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
15950 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15960 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
15970 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
15980 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
15990 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
159c0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
159d0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a00 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
15a10 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
15a20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
15a50 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
15a60 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
15a70 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
15a80 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
15a90 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
15aa0 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
15ab0 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
15ac0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
15af0 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
15b00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
15b10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15b20 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
15b30 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
15b40 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
15b50 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
15b60 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
15b70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15b80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15b90 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
15ba0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
15bb0 69 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e 20  ize(){.  return 
15bc0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
15bd0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ;.}..../*.** Clo
15be0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
15bf0 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
15c00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15c10 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
15c20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
15c30 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
15c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15c50 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
15c60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
15c70 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
15c80 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
15c90 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
15ca0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
15cb0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
15cc0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
15cd0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
15ce0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42 74 72    pBt->db = pBtr
15cf0 65 65 2d 3e 64 62 3b 0a 20 20 20 20 63 6c 65 61  ee->db;.    clea
15d00 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
15d10 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
15d20 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
15d30 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
15d40 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
15d50 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
15d60 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
15d70 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
15d80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
15d90 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
15da0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
15db0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
15dc0 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
15dd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
15de0 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
15df0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15e00 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
15e10 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
15e20 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
15e30 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
15e40 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
15e50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15e60 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
15e70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
15e90 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
15ea0 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e  or by filling in
15eb0 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70   the fields of p
15ec0 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20  TempCur..** The 
15ed0 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
15ee0 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
15ef0 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74  ursor list for t
15f00 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  he Btree..*/.voi
15f10 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  d sqlite3BtreeGe
15f20 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  tTempCursor(BtCu
15f30 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75  rsor *pCur, BtCu
15f40 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b  rsor *pTempCur){
15f50 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
15f60 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
15f70 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ) );.  memcpy(pT
15f80 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69  empCur, pCur, si
15f90 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20  zeof(*pCur));.  
15fa0 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20  pTempCur->pNext 
15fb0 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  = 0;.  pTempCur-
15fc0 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66  >pPrev = 0;.  if
15fd0 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  ( pTempCur->pPag
15fe0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
15ff0 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43 75  PagerRef(pTempCu
16000 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  r->pPage->pDbPag
16010 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
16020 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72   Delete a tempor
16030 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20  ary cursor such 
16040 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74  as was made by t
16050 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61  he CreateTempora
16060 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75  ryCursor().** fu
16070 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f  nction above..*/
16080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
16090 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
160a0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
160b0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
160c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
160d0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
160e0 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
160f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
16100 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  ref(pCur->pPage-
16110 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
16120 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
16130 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
16140 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
16150 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
16160 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
16170 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
16180 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
16190 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
161a0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
161b0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
161c0 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
161d0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
161e0 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
161f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
16200 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
16210 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
16220 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
16230 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
16240 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
16250 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
16260 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
16270 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
16280 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
16290 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
162a0 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
162b0 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
162c0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
162d0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
162e0 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
162f0 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
16300 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
16310 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
16320 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
16330 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
16340 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
16350 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
16360 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
16370 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
16380 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
16390 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e   agressive inlin
163a0 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
163b0 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
163c0 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
163d0 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
163e0 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
163f0 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
16400 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
16410 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
16420 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
16430 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
16440 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
16450 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
16460 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
16470 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
16480 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
16490 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
164a0 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  >idx, &info);.  
164b0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
164c0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
164d0 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
164e0 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
164f0 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
16500 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
16510 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
16520 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
16530 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
16540 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
16550 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
16560 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
16570 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
16580 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
16590 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
165a0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
165b0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
165c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
165d0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
165e0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
165f0 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
16600 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
16610 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
16620 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
16630 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
16640 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
16650 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
16660 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
16670 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
16680 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
16690 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
166a0 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
166b0 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
166c0 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166f0 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
16700 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
16710 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   \.    sqlite3Bt
16750 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
16760 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
16770 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  idx, &pCur->info
16780 29 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20  );         \.   
16790 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
167a0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
16820 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
16830 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
16870 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
16880 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  R */../*.** Set 
16890 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
168a0 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
168b0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
168c0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
168d0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
168e0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
168f0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
16900 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
16910 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
16920 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
16930 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
16940 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
16950 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
16960 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
16970 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
16980 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
16990 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
169a0 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
169b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
169c0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
169d0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
169e0 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
169f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
16a00 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
16a10 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
16a20 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
16a30 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
16a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16a50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
16a60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
16a70 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
16a80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
16a90 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
16aa0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
16ab0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
16ac0 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
16ad0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
16ae0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
16af0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
16b00 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
16b10 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  nfo.nKey;.    }.
16b20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
16b40 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
16b50 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
16b60 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
16b70 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
16b80 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
16b90 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
16ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
16bb0 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
16bc0 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
16bd0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
16be0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
16bf0 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
16c00 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
16c10 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
16c20 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
16c30 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
16c40 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
16c50 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
16c60 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
16c70 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
16c80 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
16c90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
16ca0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
16cb0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
16cc0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
16cd0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
16ce0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
16cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
16d00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
16d10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
16d20 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
16d30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
16d40 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
16d50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16d60 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
16d70 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69     /* Not pointi
16d80 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e  ng at a valid en
16d90 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65  try - set *pSize
16da0 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20   to 0. */.      
16db0 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
16dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
16dd0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
16de0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
16df0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b  Cur->info.nData;
16e00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16e10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16e20 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
16e30 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
16e40 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
16e50 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
16e60 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
16e70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
16e80 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
16e90 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
16ea0 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
16eb0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
16ec0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
16ed0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
16ee0 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
16ef0 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
16f00 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
16f10 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
16f20 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
16f30 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
16f40 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
16f50 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
16f60 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
16f70 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
16f80 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ise:.**.** Unles
16f90 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e  s pPgnoNext is N
16fa0 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20 6e 75  ULL, the page nu
16fb0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
16fc0 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61   overflow .** pa
16fd0 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
16fe0 20 6c 69 73 74 20 69 73 20 77 72 69 74 74 65 6e   list is written
16ff0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
17000 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20  If page ovfl.** 
17010 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
17020 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 6c   in its linked l
17030 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
17040 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
17050 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
17060 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70   is not NULL, *p
17070 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
17080 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e  the MemPage* han
17090 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20  dle.** for page 
170a0 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c  ovfl. The underl
170b0 79 69 6e 67 20 70 61 67 65 72 20 70 61 67 65 20  ying pager page 
170c0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 72 65  may have been re
170d0 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74 68 20  quested.** with 
170e0 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
170f0 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65 20 70  ag set, so the p
17100 61 67 65 20 64 61 74 61 20 61 63 63 65 73 73 61  age data accessa
17110 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69 73 20  ble via.** this 
17120 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62  handle may not b
17130 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74  e trusted..*/.st
17140 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
17150 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
17160 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67  ared *pBt, .  Pg
17170 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
17180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76             /* Ov
17190 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20  erflow page */. 
171a0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
171b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
171c0 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
171d0 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ndle */.  Pgno *
171e0 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
171f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
17200 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
17210 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
17220 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
17230 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
17240 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17250 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
17260 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20  ex) );.  /* One 
17270 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20 6e 6f  of these must no
17280 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72  t be NULL. Other
17290 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c 20 74  wise, why call t
172a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f  his function? */
172b0 0a 20 20 61 73 73 65 72 74 28 70 70 50 61 67 65  .  assert(ppPage
172c0 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a   || pPgnoNext);.
172d0 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65  .  /* If pPgnoNe
172e0 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  xt is NULL, then
172f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
17300 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74  s being called t
17310 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20  o obtain.  ** a 
17320 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72 65 6e  MemPage* referen
17330 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65  ce only. No page
17340 2d 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65  -data is require
17350 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
17360 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 6e    */.  if( !pPgn
17370 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72 65 74  oNext ){.    ret
17380 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  urn sqlite3Btree
17390 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
173a0 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20  l, ppPage, 1);. 
173b0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
173c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
173d0 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
173e0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
173f0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
17400 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
17410 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
17420 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
17430 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
17440 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
17450 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
17460 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
17470 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
17480 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
17490 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
174a0 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
174b0 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
174c0 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
174d0 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
174e0 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
174f0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
17500 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
17510 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
17520 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
17530 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
17540 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
17550 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
17560 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
17570 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
17580 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
17590 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
175a0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
175b0 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
175c0 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70     if( iGuess<=p
175d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
175e0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
175f0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
17600 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
17610 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
17620 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17640 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17650 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17660 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
17670 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
17680 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
17690 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
176a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
176b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
176c0 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67  next==0 || ppPag
176d0 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  e ){.    MemPage
176e0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
176f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
17700 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
17710 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65  ovfl, &pPage, ne
17720 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65  xt!=0);.    asse
17730 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
17740 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20   || pPage==0);. 
17750 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26     if( next==0 &
17760 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
17770 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
17780 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
17790 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20  aData);.    }.. 
177a0 20 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b     if( ppPage ){
177b0 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
177c0 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73   pPage;.    }els
177d0 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e{.      release
177e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
177f0 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e   }.  }.  *pPgnoN
17800 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72  ext = next;..  r
17810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17820 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
17830 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
17840 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
17850 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
17860 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
17870 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17880 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
17890 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
178a0 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
178b0 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
178c0 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
178d0 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
178e0 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
178f0 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
17900 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
17910 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
17920 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
17930 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
17940 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
17950 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
17960 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
17970 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
17980 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
17990 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
179a0 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
179b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
179c0 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
179d0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
179e0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
179f0 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
17a00 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
17a10 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
17a20 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
17a30 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
17a40 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
17a50 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
17a60 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
17a70 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
17a80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17a90 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
17aa0 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ac0 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
17ad0 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
17ae0 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
17af0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
17b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
17b10 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
17b20 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
17b30 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
17b40 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
17b50 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
17b60 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
17b70 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
17b80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
17b90 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
17ba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
17bc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
17bd0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
17be0 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
17bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
17c00 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
17c10 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
17c20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
17c30 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
17c40 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
17c50 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
17c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17c70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17c80 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
17c90 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
17ca0 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
17cb0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
17cc0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
17cd0 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
17ce0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66   pointing to. If
17cf0 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61   the eOp.** para
17d00 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73  meter is 0, this
17d10 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
17d20 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65  tion (data copie
17d30 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72  d into.** buffer
17d40 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73   pBuf). If it is
17d50 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69   non-zero, a wri
17d60 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  te (data copied 
17d70 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70  from.** buffer p
17d80 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  Buf)..**.** A to
17d90 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
17da0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
17db0 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
17dc0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
17dd0 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
17de0 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
17df0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
17e00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
17e10 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73  s not make a dis
17e20 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e  tinction between
17e30 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a   key and data..*
17e40 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73 20  * It just reads 
17e50 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73 20  or writes bytes 
17e60 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64  from the payload
17e70 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67   area.  Data mig
17e80 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e  ht .** appear on
17e90 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f   the main page o
17ea0 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
17eb0 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
17ec0 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65  verflow .** page
17ed0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
17ee0 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62  BtCursor.isIncrb
17ef0 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
17f00 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63  s set, and the c
17f10 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72  urrent.** cursor
17f20 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
17f30 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
17f40 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e   pages, this fun
17f50 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74  ction.** allocat
17f60 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  es space for and
17f70 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65   lazily popluate
17f80 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
17f90 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63  age-list .** cac
17fa0 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
17fb0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53  or.aOverflow). S
17fc0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
17fd0 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68  use this.** cach
17fe0 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
17ff0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
18000 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66  d offset more ef
18010 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
18020 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
18030 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
18040 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
18050 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
18060 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
18070 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
18080 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
18090 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
180a0 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
180b0 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
180c0 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
180d0 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
180e0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
180f0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
18100 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
18110 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
18120 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
18130 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
18140 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
18150 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
18160 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
18170 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
18180 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
18190 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
181a0 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
181b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
181c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
181d0 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
181e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
181f0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
18200 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
18210 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
18220 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20    int offset,   
18230 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
18240 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
18250 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
18260 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
18270 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
18280 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
18290 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
182a0 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
182b0 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
182c0 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
182d0 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c   .  int skipKey,
182e0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73           /* offs
182f0 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61 74  et begins at dat
18300 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
18310 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20  e */.  int eOp  
18320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
18330 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
18340 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
18350 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
18360 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
18370 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18380 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
18390 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
183a0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
183b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
183c0 65 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  e;     /* Btree 
183d0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
183e0 63 75 72 73 6f 72 20 65 6e 74 72 79 20 2a 2f 0a  cursor entry */.
183f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
18420 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
18430 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
18440 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
18450 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
18460 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18470 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
18480 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
18490 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
184a0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
184b0 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
184c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
184d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
184e0 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
184f0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
18500 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
18510 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
18520 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
18530 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
18540 65 79 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69  ey ? 0 : pCur->i
18550 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
18560 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
18570 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b   offset += nKey;
18580 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65  .  }.  if( offse
18590 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
185a0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b  r->info.nData ){
185b0 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
185c0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
185d0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
185e0 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
185f0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
18600 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18610 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
18620 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
18630 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
18640 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
18650 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
18660 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
18670 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
18680 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
18690 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
186a0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
186b0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
186c0 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
186d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
186e0 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
186f0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
18700 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
18710 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
18720 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
18730 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
18740 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
18750 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
18760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
18770 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
18780 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20  o.nLocal;.  }.. 
18790 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74   pBt = pCur->pBt
187a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
187b0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
187c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
187d0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
187e0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
187f0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
18800 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
18810 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
18820 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
18830 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
18840 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
18850 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
18860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18870 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
18880 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
18890 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
188a0 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
188b0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
188c0 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
188d0 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
188e0 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
188f0 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
18900 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
18910 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
18920 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
18930 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
18940 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
18950 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
18960 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
18970 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
18980 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
18990 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
189a0 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
189b0 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
189c0 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
189d0 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
189e0 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
189f0 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
18a00 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
18a10 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
18a20 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
18a30 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
18a40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
18a50 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
18a60 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
18a70 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
18a80 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
18a90 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
18aa0 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
18ab0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
18ac0 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
18ad0 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69  *nOvfl);.      i
18ae0 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75  f( nOvfl && !pCu
18af0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
18b00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
18b10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
18b20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
18b30 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
18b40 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
18b50 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
18b60 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
18b70 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
18b80 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
18b90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
18ba0 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
18bb0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
18bc0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
18bd0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
18be0 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
18bf0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
18c00 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
18c10 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
18c20 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
18c30 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
18c40 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
18c50 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
18c60 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
18c70 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
18c80 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
18c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
18ca0 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
18cb0 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
18cc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
18cd0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
18ce0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
18cf0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
18d00 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
18d10 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
18d20 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
18d30 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
18d40 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
18d50 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
18d60 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18d70 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
18d80 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
18d90 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
18da0 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
18db0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
18dc0 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
18dd0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
18de0 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
18df0 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
18e00 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
18e10 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
18e20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
18e30 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
18e40 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
18e50 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
18e60 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
18e70 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
18e80 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
18e90 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
18ea0 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
18eb0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
18ec0 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
18ed0 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
18ee0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
18ef0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
18f00 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
18f10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18f20 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
18f30 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
18f40 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
18f50 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18f60 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
18f70 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
18f80 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18f90 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
18fa0 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
18fb0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
18fc0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
18fd0 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
18fe0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
18ff0 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
19000 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
19010 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
19020 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
19030 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
19040 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
19050 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
19060 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
19070 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
19080 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
19090 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
190a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
190b0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
190c0 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
190d0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
190e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
190f0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
19100 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
19110 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
19120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19130 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
19140 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
19150 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
19160 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
19170 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
19180 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
19190 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
191a0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
191b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
191c0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
191d0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
191e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
191f0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
19200 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
19210 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
19220 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
19230 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19240 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
19250 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
19260 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
19270 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
19280 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
19290 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
192a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
192b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
192c0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
192d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
192e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
192f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
19310 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
19320 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
19330 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
19340 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
19350 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
19360 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
19370 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
19380 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
19390 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
193a0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
193b0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
193c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
193d0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
193e0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
193f0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
19400 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
19410 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
19420 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
19430 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
19440 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
19450 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
19460 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
19470 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
19480 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19490 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
194a0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
194b0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
194c0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
194d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
194e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
194f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19500 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19510 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19520 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
19530 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
19540 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
19550 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19560 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19570 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
19580 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
19590 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
195a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
195b0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
195c0 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
195d0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
195e0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
195f0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
19600 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
19610 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29  har*)pBuf, 0, 0)
19620 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19630 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
19640 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
19650 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
19660 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
19670 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
19680 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
19690 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
196a0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
196b0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
196c0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
196d0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
196e0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
196f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
19700 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
19710 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
19720 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
19730 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
19740 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
19750 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
19760 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
19770 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
19780 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
19790 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
197a0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
197b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
197c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
197d0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
197e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
197f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
19800 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19810 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
19820 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
19830 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19840 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
19850 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
19860 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
19870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19880 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
19890 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
198a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
198b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
198c0 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
198d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
198e0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
198f0 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
19900 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
19910 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
19920 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
19930 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b  mt, pBuf, 1, 0);
19940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19960 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
19970 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
19980 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
19990 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
199a0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
199b0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
199c0 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
199d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
199e0 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69  * the key if ski
199f0 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70  pKey==0 and it p
19a00 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67  oints to the beg
19a10 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69  inning of data i
19a20 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e  f.** skipKey==1.
19a30 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
19a40 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
19a50 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  le key/data is w
19a60 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
19a70 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
19a80 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
19a90 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
19aa0 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c   not be.** a val
19ab0 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
19ac0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
19ad0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
19ae0 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
19af0 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
19b00 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
19b10 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
19b20 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
19b30 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
19b40 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
19b50 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
19b60 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
19b70 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
19b80 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
19b90 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
19ba0 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
19bb0 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
19bc0 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
19bd0 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
19be0 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
19bf0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
19c00 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
19c10 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65  eassembly.** the
19c20 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
19c30 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
19c40 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
19c50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
19c60 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
19c70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
19c80 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
19c90 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
19ca0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19cb0 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
19cc0 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
19cd0 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
19ce0 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
19cf0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
19d10 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19d20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
19d30 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
19d40 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
19d50 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
19d60 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
19d70 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
19d80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
19d90 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
19da0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
19db0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
19dc0 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
19dd0 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
19de0 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
19df0 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
19e00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19e10 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
19e20 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
19e30 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c  2 nKey;.  int nL
19e40 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
19e50 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
19e60 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
19e70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
19e80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19e90 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
19ea0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19eb0 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67  (pCur) );.  pPag
19ec0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
19ed0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
19ee0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
19ef0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
19f00 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
19f10 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
19f20 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
19f30 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
19f40 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
19f50 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
19f60 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
19f70 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
19f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
19f90 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
19fa0 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
19fb0 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
19fc0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
19fd0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
19fe0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
19ff0 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
1a000 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1a010 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1a020 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
1a030 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
1a040 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
1a050 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
1a060 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
1a070 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
1a080 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
1a090 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
1a0a0 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
1a0b0 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
1a0c0 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
1a0d0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
1a0e0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
1a0f0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
1a100 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
1a110 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1a120 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
1a130 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
1a140 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1a150 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
1a160 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
1a170 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
1a180 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
1a190 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
1a1a0 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
1a1b0 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
1a1c0 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
1a1d0 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
1a1e0 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
1a1f0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
1a200 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
1a210 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
1a220 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
1a230 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
1a240 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
1a250 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
1a260 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
1a270 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
1a280 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
1a290 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
1a2a0 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
1a2b0 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
1a2c0 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
1a2d0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
1a2e0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1a2f0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1a300 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a310 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a320 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1a330 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1a340 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1a350 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1a360 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1a370 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
1a380 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
1a390 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1a3a0 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
1a3b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1a3c0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
1a3d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a3e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a3f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a400 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a410 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1a420 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
1a430 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
1a440 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
1a450 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
1a460 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a470 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
1a480 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
1a490 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
1a4a0 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
1a4b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1a4c0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
1a4d0 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve to..*/.static
1a4e0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
1a4f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1a500 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
1a510 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1a520 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1a530 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67  MemPage *pOldPag
1a540 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
1a550 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1a560 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a570 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a580 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a590 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a5a0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
1a5b0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1a5c0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
1a5d0 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72   &pNewPage, pCur
1a5e0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  ->pPage);.  if( 
1a5f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a600 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50    pNewPage->idxP
1a610 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64  arent = pCur->id
1a620 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20  x;.  pOldPage = 
1a630 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
1a640 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66  OldPage->idxShif
1a650 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  t = 0;.  release
1a660 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a  Page(pOldPage);.
1a670 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1a680 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
1a690 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75  ->idx = 0;.  pCu
1a6a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1a6b0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
1a6c0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
1a6d0 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
1a6e0 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
1a6f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a700 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
1a710 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a720 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1a730 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
1a740 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
1a750 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a  t of its table..
1a760 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61  **.** The virtua
1a770 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
1a780 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  he root page for
1a790 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42   most tables.  B
1a7a0 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  ut.** for the ta
1a7b0 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61  ble rooted on pa
1a7c0 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74  ge 1, sometime t
1a7d0 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67  he real root pag
1a7e0 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78  e.** is empty ex
1a7f0 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67  cept for the rig
1a800 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20  ht-pointer.  In 
1a810 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a  such cases the.*
1a820 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
1a830 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
1a840 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70  that the right-p
1a850 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a  ointer of page.*
1a860 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  * 1 is pointing 
1a870 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
1a880 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
1a890 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1a8a0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1a8b0 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
1a8c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a8d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1a8e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
1a8f0 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
1a900 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61  arent;.  if( pPa
1a910 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  rent==0 ) return
1a920 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e   1;.  if( pParen
1a930 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75  t->pgno>1 ) retu
1a940 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32  rn 0;.  if( get2
1a950 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1a960 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1a970 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29  rOffset+3])==0 )
1a980 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1a990 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1a9a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a9b0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
1a9c0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
1a9d0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1a9e0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
1a9f0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1aa00 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
1aa10 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
1aa20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
1aa30 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1aa40 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
1aa50 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
1aa60 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
1aa70 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
1aa80 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
1aa90 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
1aaa0 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1aab0 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
1aac0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
1aad0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1aae0 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61  pParent;.  MemPa
1aaf0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
1ab00 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61   idxParent;..  a
1ab10 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1ab20 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1ab30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ab40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ab50 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65  VALID );.  pPage
1ab60 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1ab70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
1ab80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1ab90 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52  !sqlite3BtreeIsR
1aba0 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
1abb0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
1abc0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
1abd0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
1abe0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1abf0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2d 3e  pPage->pDbPage->
1ac00 6e 52 65 66 3e 30 20 29 3b 0a 20 20 69 64 78 50  nRef>0 );.  idxP
1ac10 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69  arent = pPage->i
1ac20 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69  dxParent;.  sqli
1ac30 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
1ac40 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
1ac50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1ac60 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  ge);.  pCur->pPa
1ac70 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  ge = pParent;.  
1ac80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1ac90 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1aca0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 61  lidNKey = 0;.  a
1acb0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1acc0 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
1acd0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
1ace0 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
1acf0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1ad00 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
1ad10 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1ad20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
1ad30 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
1ad40 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
1ad50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ad60 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
1ad70 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1ad80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ad90 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
1ada0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1adb0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1adc0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
1add0 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
1ade0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1adf0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1ae00 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
1ae10 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1ae20 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1ae30 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
1ae40 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1ae50 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1ae60 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
1ae70 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
1ae80 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1ae90 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
1aea0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
1aeb0 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a  ur->skip;.    }.
1aec0 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
1aed0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1aee0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
1aef0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
1af00 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
1af10 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
1af20 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
1af30 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
1af40 74 3d 3d 50 41 47 45 5f 49 53 49 4e 49 54 5f 46  t==PAGE_ISINIT_F
1af50 55 4c 4c 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ULL );.  }else{.
1af60 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53      if( .      S
1af70 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
1af80 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
1af90 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
1afa0 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a  ot, &pRoot, 0)).
1afb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75      ){.      pCu
1afc0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1afd0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1afe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1aff0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
1b000 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ge(pCur->pPage);
1b010 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
1b020 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20   = pRoot;.  }.  
1b030 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20  pCur->idx = 0;. 
1b040 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1b050 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
1b060 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75  tLast = 0;.  pCu
1b070 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1b080 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ;.  if( pRoot->n
1b090 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
1b0a0 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
1b0b0 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
1b0c0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1b0d0 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73  pgno==1 );.    s
1b0e0 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
1b0f0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
1b100 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
1b110 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
1b120 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20  ( subpage>0 );. 
1b130 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1b140 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
1b150 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1b160 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
1b170 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ge);.  }.  pCur-
1b180 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72  >eState = ((pCur
1b190 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
1b1a0 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
1b1b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
1b1c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b1d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1b1e0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1b1f0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
1b200 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1b210 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
1b220 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1b230 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
1b240 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
1b250 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
1b260 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
1b270 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
1b280 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
1b290 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
1b2a0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1b2b0 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
1b2c0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1b2d0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
1b2e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
1b2f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1b300 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b310 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1b330 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b340 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1b350 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1b360 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1b370 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
1b380 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
1b390 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
1b3a0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
1b3b0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1b3c0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
1b3d0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1b3e0 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20  pCur->idx));.   
1b3f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1b400 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
1b410 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b420 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1b430 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1b440 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1b450 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
1b460 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
1b470 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
1b480 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1b490 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
1b4a0 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
1b4b0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
1b4c0 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
1b4d0 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
1b4e0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
1b4f0 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
1b500 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1b510 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
1b520 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
1b530 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
1b540 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
1b550 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1b560 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
1b570 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
1b580 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
1b590 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
1b5a0 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
1b5b0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
1b5c0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
1b5d0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1b5e0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
1b5f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1b600 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1b610 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b620 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1b630 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1b640 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1b650 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1b660 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b670 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1b680 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1b690 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1b6a0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
1b6b0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
1b6c0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1b6d0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1b6e0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1b6f0 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70     pCur->idx = p
1b700 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
1b710 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1b720 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
1b730 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1b740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
1b750 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d  ur->idx = pPage-
1b760 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20  >nCell - 1;.    
1b770 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1b780 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
1b790 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1b7a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b7b0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1b7c0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
1b7d0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1b7e0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1b7f0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1b800 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1b810 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1b820 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1b830 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1b840 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1b850 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1b860 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1b870 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b880 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
1b890 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1b8a0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
1b8b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1b8c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1b8d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1b8e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b8f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1b900 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1b910 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1b920 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1b930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b940 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1b950 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1b960 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b970 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1b980 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1b990 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1b9a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b9b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b9c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b9d0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
1b9e0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1b9f0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1ba00 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1ba10 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
1ba20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ba30 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1ba40 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
1ba50 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1ba60 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1ba70 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1ba80 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1ba90 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1baa0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1bab0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1bac0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1bad0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1bae0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1baf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1bb00 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1bb10 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1bb20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
1bb30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1bb40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1bb50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1bb60 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1bb70 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1bb80 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
1bb90 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1bba0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bbb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
1bbc0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1bbd0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1bbe0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1bbf0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1bc00 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
1bc10 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
1bc20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bc30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1bc40 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1bc50 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1bc60 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1bc70 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1bc80 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1bc90 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1bca0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
1bcb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  c==SQLITE_OK;.  
1bcc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bcd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
1bce0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
1bcf0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1bd00 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
1bd10 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
1bd20 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
1bd30 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
1bd40 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
1bd50 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
1bd60 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
1bd70 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
1bd80 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
1bd90 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
1bda0 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
1bdb0 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
1bdc0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
1bdd0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
1bde0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
1bdf0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
1be00 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
1be10 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
1be20 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
1be30 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
1be40 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
1be50 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
1be60 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
1be70 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
1be80 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
1be90 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
1bea0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
1beb0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
1bec0 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  *.** The result 
1bed0 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  of comparing the
1bee0 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
1bef0 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
1bf00 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72  .** cursor is wr
1bf10 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69  itten to *pRes i
1bf20 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54  f pRes!=NULL.  T
1bf30 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a  he meaning of.**
1bf40 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 61   this value is a
1bf50 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1bf60 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
1bf70 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1bf80 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1bf90 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1bfa0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1bfb0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
1bfc0 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68  an pKey or if th
1bfd0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1bfe0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1bff0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
1c000 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
1c010 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
1c020 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
1c030 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
1c040 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1c050 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1c060 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
1c090 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  pKey..**.**     
1c0a0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
1c0b0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1c0c0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1c0d0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1c0f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65   larger than pKe
1c100 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
1c110 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
1c120 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
1c130 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1c140 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1c150 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
1c160 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1c170 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
1c180 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1c190 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
1c1a0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1c1b0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
1c1c0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
1c1d0 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
1c1e0 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
1c1f0 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
1c200 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
1c210 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
1c220 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1c230 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
1c240 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1c250 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1c260 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c270 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1c280 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1c290 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1c2a0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1c2b0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1c2c0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
1c2d0 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
1c2e0 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
1c2f0 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
1c300 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
1c310 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
1c320 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
1c330 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
1c340 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c350 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76  VALID && pCur->v
1c360 61 6c 69 64 4e 4b 65 79 20 26 26 20 70 43 75 72  alidNKey && pCur
1c370 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
1c380 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1c390 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
1c3a0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1c3b0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1c3c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c3d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1c3e0 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1c3f0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
1c400 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1c410 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
1c420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c430 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 72  .    }.  }...  r
1c440 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1c450 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1c460 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1c470 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c480 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
1c490 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1c4a0 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47  age->isInit==PAG
1c4b0 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29 3b  E_ISINIT_FULL );
1c4c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1c4d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1c4e0 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
1c4f0 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
1c500 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1c510 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1c520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c530 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1c540 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
1c550 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
1c560 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
1c570 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20   int lwr, upr;. 
1c580 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
1c590 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1c5a0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1c5b0 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31  ;.    int c = -1
1c5c0 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72  ;  /* pRes retur
1c5d0 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d  n if table is em
1c5e0 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a  pty must be -1 *
1c5f0 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  /.    lwr = 0;. 
1c600 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
1c610 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
1c620 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
1c630 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 7b  && pIdxKey==0 ){
1c640 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c650 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1c660 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
1c670 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
1c680 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67  .    if( biasRig
1c690 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ht ){.      pCur
1c6a0 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20  ->idx = upr;.   
1c6b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
1c6c0 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c  ur->idx = (upr+l
1c6d0 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20  wr)/2;.    }.   
1c6e0 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20   if( lwr<=upr ) 
1c6f0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76  for(;;){.      v
1c700 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
1c710 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
1c720 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  y;.      pCur->i
1c730 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1c740 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
1c750 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  NKey = 1;.      
1c760 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1c770 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  y ){.        u8 
1c780 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pCell;.        
1c790 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1c7a0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
1c7b0 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
1c7c0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
1c7d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
1c7e0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
1c7f0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
1c800 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
1c810 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
1c820 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  l, dummy);.     
1c830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
1c840 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
1c850 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
1c860 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
1c870 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  lKey==intKey ){.
1c880 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
1c890 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c8a0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
1c8b0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1c8c0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1c8d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c8e0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
1c8f0 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  y>intKey );.    
1c900 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
1c910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1c920 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1c930 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20   available;.    
1c940 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28      pCellKey = (
1c950 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c  void *)fetchPayl
1c960 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c  oad(pCur, &avail
1c970 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
1c980 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75    nCellKey = pCu
1c990 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1c9a0 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61        if( availa
1c9b0 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b  ble>=nCellKey ){
1c9c0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
1c9d0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1c9e0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79  Compare(nCellKey
1c9f0 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
1ca00 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
1ca10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1ca20 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
1ca30 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65  3Malloc( nCellKe
1ca40 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  y );.          i
1ca50 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
1ca60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1ca70 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1ca80 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1ca90 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1caa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1cab0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1cac0 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
1cad0 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28  , 0, nCellKey, (
1cae0 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29  void *)pCellKey)
1caf0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
1cb00 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1cb10 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65  dCompare(nCellKe
1cb20 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  y, pCellKey, pId
1cb30 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
1cb40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1cb50 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1cb60 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
1cb70 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1cb80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cb90 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
1cba0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1cbb0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
1cbc0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
1cbd0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1cbe0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
1cbf0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
1cc00 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a  wr = pCur->idx;.
1cc10 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
1cc20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
1cc30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1cc40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cc50 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70     if( pRes ) *p
1cc60 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
1cc70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1cc80 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1cc90 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1cca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ccb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
1ccc0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
1ccd0 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20  = pCur->idx+1;. 
1cce0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ccf0 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e      upr = pCur->
1cd00 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
1cd10 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
1cd20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1cd30 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
1cd40 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
1cd50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1cd60 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1cd70 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20   (lwr+upr)/2;.  
1cd80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1cd90 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20  lwr==upr+1 );.  
1cda0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1cdb0 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45 5f 49 53  >isInit==PAGE_IS
1cdc0 49 4e 49 54 5f 46 55 4c 4c 20 29 3b 0a 20 20 20  INIT_FULL );.   
1cdd0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1cde0 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1cdf0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1ce00 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
1ce10 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
1ce20 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1ce30 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ce40 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1ce50 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
1ce60 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1ce70 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1ce80 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
1ce90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
1cea0 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
1ceb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1cec0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1ced0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
1cee0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1cef0 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1cf00 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
1cf10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1cf20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1cf30 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
1cf40 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20  ur->idx = lwr;. 
1cf50 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1cf60 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
1cf70 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1cf80 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1cf90 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
1cfa0 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
1cfb0 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1cfc0 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74  inish;.  }.movet
1cfd0 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75  o_finish:.  retu
1cfe0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cff0 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
1d000 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
1d010 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
1d020 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
1d030 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
1d040 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
1d050 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1d060 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
1d070 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
1d080 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
1d090 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
1d0a0 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
1d0b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d0c0 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
1d0d0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
1d0e0 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
1d0f0 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
1d100 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
1d110 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1d120 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
1d130 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
1d140 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
1d150 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
1d160 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
1d170 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
1d180 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
1d190 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
1d1a0 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
1d1b0 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
1d1c0 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1d1d0 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1d1e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1d1f0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
1d200 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1d210 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1d220 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
1d230 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
1d240 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
1d250 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
1d260 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
1d270 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1d280 20 61 53 70 61 63 65 5b 31 36 5d 3b 20 2f 2a 20   aSpace[16]; /* 
1d290 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
1d2a0 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
1d2b0 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  d a malloc */.. 
1d2c0 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1d2d0 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
1d2e0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1d2f0 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ck(pCur->pKeyInf
1d300 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  o, nKey, pKey,. 
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
1d340 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
1d350 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
1d360 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1d370 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
1d380 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
1d390 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1d3a0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
1d3b0 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
1d3c0 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
1d3d0 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
1d3e0 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
1d3f0 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
1d400 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
1d410 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
1d420 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1d430 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1d440 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1d450 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1d460 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1d470 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1d480 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1d490 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1d4a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1d4b0 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1d4c0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1d4d0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1d4e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1d4f0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1d500 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1d510 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1d520 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1d530 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1d540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d550 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1d560 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1d570 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1d580 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1d590 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1d5a0 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1d5b0 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1d5c0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1d5d0 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1d5e0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1d5f0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1d600 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1d610 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1d620 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1d630 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1d640 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1d650 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1d660 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1d670 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d680 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75   handle for a cu
1d690 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rsor..*/.sqlite3
1d6a0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   *sqlite3BtreeCu
1d6b0 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43  rsorDb(const BtC
1d6c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1d6d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d6e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1d6f0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1d700 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
1d710 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1d720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
1d730 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
1d740 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
1d750 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1d760 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1d770 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1d780 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1d790 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1d7a0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1d7b0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1d7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1d7d0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1d7e0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1d7f0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1d800 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
1d810 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
1d820 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1d830 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1d840 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1d850 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1d860 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d870 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1d880 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1d890 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1d8a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d8b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1d8c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1d8d0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61  pRes!=0 );.  pPa
1d8e0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1d8f0 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
1d900 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1d910 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
1d920 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1d930 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1d940 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1d950 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
1d960 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1d970 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1d980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d990 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1d9a0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1d9b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
1d9c0 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c  PAGE_ISINIT_FULL
1d9d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d9e0 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
1d9f0 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
1da00 3e 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e  >idx++;.  pCur->
1da10 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1da20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1da30 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  y = 0;.  if( pCu
1da40 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  r->idx>=pPage->n
1da50 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
1da60 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1da70 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1da80 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
1da90 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1daa0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1dab0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
1dac0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1dad0 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
1dae0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1daf0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
1db00 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1db10 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1db20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
1db30 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
1db40 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b  otPage(pPage) ){
1db50 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
1db60 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
1db70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1db80 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1db90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dba0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1dbb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
1dbc0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1dbd0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1dbe0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1dbf0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
1dc00 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1dc10 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  l );.    *pRes =
1dc20 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1dc30 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
1dc40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1dc50 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
1dc60 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
1dc70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1dc80 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1dc90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1dca0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
1dcb0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
1dcc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1dcd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
1dce0 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
1dcf0 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
1dd00 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1dd10 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
1dd20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
1dd30 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
1dd40 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1dd50 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
1dd60 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
1dd70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
1dd80 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
1dd90 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
1dda0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1ddb0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1ddc0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1ddd0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1dde0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1ddf0 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
1de00 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1de10 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
1de20 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1de30 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
1de40 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gno;.  MemPage *
1de50 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1de60 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1de70 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1de80 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1de90 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1dea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1deb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1dec0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
1ded0 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
1dee0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1def0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1df00 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1df10 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1df20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1df30 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20  f( pCur->skip<0 
1df40 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
1df50 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
1df60 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1df70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1df80 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1df90 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
1dfa0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
1dfb0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
1dfc0 74 3d 3d 50 41 47 45 5f 49 53 49 4e 49 54 5f 46  t==PAGE_ISINIT_F
1dfd0 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ULL );.  assert(
1dfe0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b   pCur->idx>=0 );
1dff0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1e000 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
1e010 3d 20 67 65 74 34 62 79 74 65 28 20 66 69 6e 64  = get4byte( find
1e020 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
1e030 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63  ->idx) );.    rc
1e040 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1e050 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
1e060 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1e070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1e080 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1e090 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1e0a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
1e0b0 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d  ile( pCur->idx==
1e0c0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
1e0d0 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f  qlite3BtreeIsRoo
1e0e0 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
1e0f0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1e100 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1e110 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
1e120 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1e130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e140 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1e150 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
1e160 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1e170 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1e180 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
1e190 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78   }.    pCur->idx
1e1a0 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  --;.    pCur->in
1e1b0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1e1c0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1e1d0 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
1e1e0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
1e1f0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1e200 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e210 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
1e220 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1e230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1e240 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e250 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20    }.  }.  *pRes 
1e260 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1e270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
1e280 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
1e290 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e2a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
1e2b0 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
1e2c0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
1e2d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1e2e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e2f0 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
1e300 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
1e310 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
1e320 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
1e330 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
1e340 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
1e350 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
1e360 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
1e370 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
1e380 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e390 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
1e3a0 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
1e3b0 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
1e3c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e3d0 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
1e3e0 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
1e3f0 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
1e400 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
1e410 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
1e420 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
1e430 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
1e440 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
1e450 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
1e460 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
1e470 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
1e480 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1e490 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
1e4a0 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
1e4b0 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
1e4c0 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f   a (feeble) effo
1e4d0 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
1e4e0 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
1e4f0 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
1e500 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
1e510 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
1e520 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
1e530 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
1e540 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
1e550 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
1e560 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1e570 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
1e580 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
1e590 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
1e5a0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
1e5b0 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72   the "exact" par
1e5c0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
1e5d0 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75   and the page-nu
1e5e0 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73  mber nearby exis
1e5f0 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  ts .** anywhere 
1e600 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1e610 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
1e620 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  renteed to be re
1e630 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
1e640 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
1e650 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1e660 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63  bases when alloc
1e670 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
1e680 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e690 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1e6a0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1e6b0 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20  pBt, .  MemPage 
1e6c0 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e  **ppPage, .  Pgn
1e6d0 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e  o *pPgno, .  Pgn
1e6e0 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65  o nearby,.  u8 e
1e6f0 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  xact.){.  MemPag
1e700 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
1e710 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20   rc;.  int n;   
1e720 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1e730 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1e740 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b  list */.  int k;
1e750 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e760 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
1e770 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
1e780 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
1e790 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
1e7a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
1e7b0 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73  Trunk = 0;..  as
1e7c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1e7d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1e7e0 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31  tex) );.  pPage1
1e7f0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1e800 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
1e810 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e820 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  ]);.  if( n>0 ){
1e830 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
1e840 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
1e850 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
1e860 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
1e870 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
1e880 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
1e890 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
1e8a0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
1e8b0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
1e8c0 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
1e8d0 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
1e8e0 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70  If the 'exact' p
1e8f0 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75  arameter was tru
1e900 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  e and a query of
1e910 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1e920 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
1e930 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
1e940 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
1e950 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
1e960 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
1e970 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
1e980 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
1e990 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
1e9a0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
1e9b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e9c0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78  ACUUM.    if( ex
1e9d0 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 70  act && nearby<=p
1e9e0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1e9f0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
1ea00 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1ea10 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
1ea20 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
1ea30 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
1ea40 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
1ea50 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1ea60 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
1ea70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
1ea80 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1ea90 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1eaa0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1eab0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
1eac0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
1ead0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
1eae0 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
1eaf0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1eb00 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
1eb10 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
1eb20 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
1eb30 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
1eb40 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
1eb50 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
1eb60 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
1eb70 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
1eb80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1eb90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1eba0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1ebb0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1ebc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ebd0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1ebe0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
1ebf0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
1ec00 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
1ec10 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
1ec20 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
1ec30 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
1ec40 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
1ec50 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
1ec60 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
1ec70 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
1ec80 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
1ec90 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
1eca0 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
1ecb0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
1ecc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
1ecd0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
1ece0 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
1ecf0 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
1ed00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
1ed10 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1ed20 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
1ed30 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
1ed40 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
1ed50 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
1ed60 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
1ed70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ed80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ed90 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
1eda0 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
1edb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1edc0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
1edd0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
1ede0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1edf0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
1ee00 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
1ee10 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1ee20 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
1ee30 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
1ee40 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
1ee50 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
1ee60 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
1ee70 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
1ee80 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
1ee90 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
1eea0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
1eeb0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
1eec0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
1eed0 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
1eee0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
1eef0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1ef00 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
1ef10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1ef20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ef30 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1ef40 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1ef50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1ef60 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1ef70 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1ef80 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
1ef90 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
1efa0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1efb0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
1efc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1efd0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
1efe0 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
1eff0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1f000 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
1f010 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1f020 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
1f030 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
1f040 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
1f050 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
1f060 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1f070 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20  4 - 2 ){.       
1f080 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
1f090 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
1f0a0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
1f0b0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1f0c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1f0d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1f0e0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1f0f0 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
1f100 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f110 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
1f120 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
1f130 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
1f140 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1f150 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
1f160 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
1f170 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
1f180 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
1f190 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
1f1a0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
1f1b0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
1f1c0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
1f1d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
1f1e0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
1f1f0 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
1f200 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
1f210 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
1f220 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
1f230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f240 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1f250 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f260 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1f270 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1f280 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1f290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f2a0 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
1f2b0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1f2c0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1f2d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1f2e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1f2f0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1f300 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1f310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f320 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1f330 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
1f340 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1f350 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1f360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f380 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
1f390 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
1f3a0 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
1f3b0 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
1f3c0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
1f3d0 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
1f3e0 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
1f3f0 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
1f400 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
1f410 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
1f420 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
1f430 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
1f440 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
1f450 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
1f460 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
1f470 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1f480 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
1f490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f4a0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1f4b0 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
1f4c0 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
1f4d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f4e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f4f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1f500 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1f510 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f520 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f530 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
1f540 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
1f550 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f570 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
1f580 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
1f590 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
1f5a0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1f5b0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1f5c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
1f5d0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
1f5e0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1f5f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1f600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
1f610 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
1f620 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
1f630 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
1f640 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1f650 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
1f660 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
1f670 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
1f680 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
1f690 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1f6a0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
1f6b0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
1f6c0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1f6d0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
1f6e0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1f6f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f700 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f710 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f720 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
1f730 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1f740 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1f750 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1f760 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1f770 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f780 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1f790 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
1f7a0 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
1f7b0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1f7c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1f7d0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
1f7e0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
1f7f0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
1f800 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
1f810 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
1f820 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
1f830 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
1f840 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
1f850 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
1f860 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
1f870 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b      int closest;
1f880 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
1f890 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
1f8a0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
1f8b0 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
1f8c0 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  a;.        rc = 
1f8d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f8e0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1f8f0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1f900 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1f910 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1f920 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1f930 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
1f940 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
1f950 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b      int i, dist;
1f960 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
1f970 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1f980 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74    dist = get4byt
1f990 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
1f9a0 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
1f9b0 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69   if( dist<0 ) di
1f9c0 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20  st = -dist;.    
1f9d0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
1f9e0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
1f9f0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67        int d2 = g
1fa00 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
1fa10 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b  +i*4]) - nearby;
1fa20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1fa30 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32   d2<0 ) d2 = -d2
1fa40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1fa50 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
1fa60 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
1fa70 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
1fa80 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
1fa90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1faa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fac0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
1fad0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1fae0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
1faf0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
1fb00 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
1fb10 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
1fb20 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61  st || iPage==nea
1fb30 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
1fb40 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20   int nPage;.    
1fb50 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1fb60 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1fb70 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
1fb80 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1fb90 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
1fba0 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20  f( *pPgno>nPage 
1fbb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
1fbc0 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20  * Free page off 
1fbd0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
1fbe0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
1fbf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1fc00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1fc10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1fc20 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1fc30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fc40 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1fc50 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
1fc60 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
1fc70 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
1fc90 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
1fca0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1fcb0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
1fcc0 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
1fcd0 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
1fce0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1fcf0 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
1fd00 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1fd10 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
1fd20 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
1fd30 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
1fd40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1fd50 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
1fd60 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1fd70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fd80 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1fd90 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
1fda0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
1fdb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fdc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1fdd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1fde0 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61  tRollback((*ppPa
1fdf0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1fe00 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1fe10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1fe20 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
1fe30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1fe40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fe50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1fe60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1fe70 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1fe80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fe90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1fea0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1feb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fec0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
1fed0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1fee0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
1fef0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
1ff00 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
1ff10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ff20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
1ff30 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1ff40 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
1ff50 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
1ff60 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
1ff70 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  he file */.    i
1ff80 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72  nt nPage = pager
1ff90 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1ffa0 50 61 67 65 72 29 3b 0a 20 20 20 20 2a 70 50 67  Pager);.    *pPg
1ffb0 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a  no = nPage + 1;.
1ffc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ffd0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ffe0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
1fff0 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  unc ){.      /* 
20000 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68  An incr-vacuum h
20010 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77  as already run w
20020 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
20030 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20  action. So the. 
20040 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20       ** page to 
20050 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20  allocate is not 
20060 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61  from the physica
20070 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  l end of the fil
20080 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  e, but.      ** 
20090 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20  at pBt->nTrunc. 
200a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
200b0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54  *pPgno = pBt->nT
200c0 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66  runc+1;.      if
200d0 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
200e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
200f0 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50   ){.        (*pP
20100 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  gno)++;.      }.
20110 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
20120 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
20130 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
20140 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
20150 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
20160 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
20170 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
20180 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
20190 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
201a0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
201b0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
201c0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
201d0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
201e0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
201f0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
20200 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
20210 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
20220 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
20230 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28   */.      TRACE(
20240 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
20250 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
20260 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
20270 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  e)\n", *pPgno));
20280 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
20290 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
202a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
202b0 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
202c0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50  +;.      if( *pP
202d0 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
202e0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28  E_PAGE(pBt) ){ (
202f0 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20  *pPgno)++; }.   
20300 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
20310 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
20320 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70  pBt->nTrunc = *p
20330 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Pgno;.    }.#end
20340 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
20350 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
20360 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20370 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
20380 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
20390 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
203a0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
203b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
203c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
203d0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
203e0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
203f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20410 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
20420 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
20430 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
20440 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
20450 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
20460 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
20470 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
20480 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20490 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
204a0 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
204b0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
204c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
204d0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
204e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
204f0 0a 20 20 20 20 69 66 28 20 28 2a 70 70 50 61 67  .    if( (*ppPag
20500 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 50 41 47 45  e)->isInit==PAGE
20510 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20 29 7b 0a  _ISINIT_FULL ){.
20520 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20530 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
20540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20550 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20560 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
20570 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
20580 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20590 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70  }../*.** Add a p
205a0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
205b0 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
205c0 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
205d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
205e0 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65  f() is NOT calle
205f0 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  d for pPage..*/.
20600 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
20610 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
20620 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
20630 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
20640 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
20650 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
20660 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c  e1;.  int rc, n,
20670 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72   k;..  /* Prepar
20680 65 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66  e the page for f
20690 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65  reeing */.  asse
206a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
206b0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
206c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
206d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
206e0 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d  no>1 );.  pPage-
206f0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72  >isInit = 0;.  r
20700 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
20710 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50  ->pParent);.  pP
20720 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30  age->pParent = 0
20730 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
20740 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
20750 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
20760 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
20770 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
20780 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
20790 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
207a0 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  rc;.  n = get4by
207b0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
207c0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
207d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
207e0 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69  a[36], n+1);..#i
207f0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
20800 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49  RE_DELETE.  /* I
20810 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43  f the SQLITE_SEC
20820 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69  URE_DELETE compi
20830 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
20840 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
20850 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
20860 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
20870 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
20880 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f  with zeros..  */
20890 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
208a0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
208b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
208c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
208d0 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d  .  memset(pPage-
208e0 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
208f0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
20900 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
20910 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
20920 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
20930 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
20940 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
20950 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
20960 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20970 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
20980 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
20990 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63  VACUUM ){.    rc
209a0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
209b0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50  , pPage->pgno, P
209c0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
209d0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
209e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
209f0 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
20a00 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
20a10 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
20a20 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
20a30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20a40 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
20a50 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
20a60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d  turn rc;.    mem
20a70 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
20a80 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74  , 0, 8);.    put
20a90 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
20aa0 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
20ab0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43  >pgno);.    TRAC
20ac0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
20ad0 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67  d first\n", pPag
20ae0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
20af0 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72  se{.    /* Other
20b00 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65   free pages alre
20b10 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72  ady exist.  Retr
20b20 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72  ive the first tr
20b30 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  unk page.    ** 
20b40 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
20b50 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77  and find out how
20b60 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20   many leaves it 
20b70 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  has. */.    MemP
20b80 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20  age *pTrunk;.   
20b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20ba0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67  eeGetPage(pBt, g
20bb0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
20bc0 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54  >aData[32]), &pT
20bd0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
20be0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
20bf0 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79  ;.    k = get4by
20c00 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
20c10 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b  a[4]);.    if( k
20c20 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  >=pBt->usableSiz
20c30 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
20c40 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73   /* The trunk is
20c50 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65   full.  Turn the
20c60 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
20c70 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20  d into a new.   
20c80 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65     ** trunk page
20c90 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e   with no leaves.
20ca0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
20cb0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
20cc0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
20cd0 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
20ce0 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
20cf0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
20d00 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
20d10 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
20d20 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
20d30 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
20d40 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
20d50 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
20d60 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
20d70 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
20d80 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
20d90 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
20da0 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
20db0 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
20dc0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
20dd0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
20de0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
20df0 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
20e00 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
20e10 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
20e20 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
20e30 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
20e40 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
20e50 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
20e60 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
20e70 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73  l contain to res
20e80 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
20e90 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
20ea0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
20eb0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
20ec0 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
20ed0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
20ee0 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
20ef0 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
20f00 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
20f10 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
20f20 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
20f30 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
20f40 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
20f50 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
20f60 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
20f70 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
20f80 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
20f90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20fa0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
20fb0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
20fc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20fe0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
20ff0 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70  aData, pTrunk->p
21000 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 75  gno);.        pu
21010 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
21020 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  Data[4], 0);.   
21030 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
21040 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
21050 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
21060 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
21070 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
21080 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
21090 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20  lacing %d\n",.  
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
210b0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e  age->pgno, pTrun
210c0 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
210d0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
210e0 20 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63   k<0 ){.      rc
210f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
21100 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
21110 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
21120 65 77 6c 79 20 66 72 65 65 64 20 70 61 67 65 20  ewly freed page 
21130 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65  as a leaf on the
21140 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a   current trunk *
21150 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
21160 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
21170 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
21180 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
21190 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
211a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
211b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
211c0 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  k+1);.        pu
211d0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
211e0 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50  aData[8+k*4], pP
211f0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e  age->pgno);.#ifn
21200 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
21210 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
21220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21230 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
21240 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e  e->pDbPage);.#en
21250 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
21260 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
21270 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
21280 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
21290 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
212a0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
212b0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
212c0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
212d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
212e0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
212f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
21300 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
21310 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
21320 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
21330 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
21340 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
21350 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
21360 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
21370 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
21380 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
21390 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
213a0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
213b0 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61  fl;.  int ovflPa
213c0 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
213d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
213e0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
213f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
21400 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
21410 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
21420 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
21430 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
21440 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
21450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
21460 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
21470 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
21480 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
21490 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
214a0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
214b0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
214c0 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50  rflow]);.  ovflP
214d0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
214e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
214f0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
21500 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
21510 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
21520 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
21530 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
21540 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
21550 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
21560 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
21570 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
21580 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c  fl;.    if( ovfl
21590 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50  Pgno==0 || ovflP
215a0 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
215b0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
215c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
215d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
215e0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
215f0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
21600 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
21610 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76  no, &pOvfl, (nOv
21620 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67  fl==0)?0:&ovflPg
21630 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
21640 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
21650 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
21660 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ovfl);.    sqlit
21670 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
21680 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
21690 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
216a0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
216b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
216c0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
216d0 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
216e0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
216f0 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
21700 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
21710 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
21720 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
21730 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
21740 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
21750 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
21760 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
21770 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
21780 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
21790 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
217a0 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
217b0 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
217c0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
217d0 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
217e0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
217f0 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
21800 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
21810 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
21820 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
21830 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
21840 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
21850 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
21860 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
21870 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
21880 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
21890 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
218a0 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
218b0 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
218c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
218d0 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
218e0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
218f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21900 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
21910 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
21920 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
21930 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
21940 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
21950 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
21960 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
21970 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
21980 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
21990 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
219a0 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
219b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
219c0 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219e0 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
219f0 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
21a00 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
21a10 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a30 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
21a40 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
21a50 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
21a60 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
21a70 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
21a80 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
21a90 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
21aa0 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
21ab0 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
21ac0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
21ad0 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
21ae0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
21af0 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
21b00 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
21b10 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
21b20 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
21b30 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
21b40 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
21b50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21b60 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
21b70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
21b80 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
21b90 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
21ba0 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
21bb0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
21bc0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
21bd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
21be0 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
21bf0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
21c00 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
21c10 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
21c20 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
21c30 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
21c40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
21c50 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
21c60 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
21c70 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
21c80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
21c90 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
21ca0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
21cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
21cc0 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65  .nHeader==nHeade
21cd0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r );.  assert( i
21ce0 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
21cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
21d00 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a  .nData==nData+nZ
21d10 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ero );.  .  /* F
21d20 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
21d30 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
21d40 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
21d50 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
21d60 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
21d70 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
21d80 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
21d90 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
21da0 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
21db0 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70  d += nKey;.    p
21dc0 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
21dd0 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d  nSrc = nKey;.  }
21de0 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
21df0 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
21e00 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
21e10 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
21e20 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
21e30 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
21e40 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
21e50 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
21e60 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
21e70 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
21e80 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
21e90 73 45 78 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e  sExact = 0;.#ifn
21ea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21eb0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
21ec0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
21ed0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
21ee0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
21ef0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
21f00 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
21f10 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
21f20 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
21f30 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
21f40 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
21f50 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
21f60 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
21f70 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
21f80 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
21f90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
21fa0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
21fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
21fc0 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  Ovfl>1 ){.      
21fd0 20 20 20 20 2f 2a 20 69 73 45 78 61 63 74 20 3d      /* isExact =
21fe0 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d   1; */.        }
21ff0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
22000 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
22010 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
22020 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
22030 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69  vfl, pgnoOvfl, i
22040 73 45 78 61 63 74 29 3b 0a 23 69 66 6e 64 65 66  sExact);.#ifndef
22050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22060 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
22070 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
22080 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
22090 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
220a0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
220b0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
220c0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
220d0 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
220e0 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
220f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
22100 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
22110 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
22120 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
22130 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
22140 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
22150 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
22160 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
22170 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
22180 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
22190 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
221a0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
221b0 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
221c0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
221d0 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
221e0 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
221f0 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
22200 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
22210 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
22220 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65  nitialised value
22230 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
22240 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
22250 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
22260 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
22270 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
22280 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
22290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
222a0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
222b0 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
222c0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
222d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
222e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
222f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
22300 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
22310 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20  pgnoPtrmap);.   
22320 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
22330 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
22340 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
22350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
22360 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
22370 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
22380 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
22390 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
223a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
223b0 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
223c0 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
223d0 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
223e0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
223f0 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
22400 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
22410 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
22420 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
22430 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
22440 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
22450 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
22460 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
22470 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
22480 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
22490 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
224a0 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
224b0 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
224c0 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20   spaceLeft;.    
224d0 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
224e0 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
224f0 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
22500 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
22510 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
22520 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
22530 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22540 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
22550 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
22560 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
22570 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
22580 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
22590 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
225a0 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
225b0 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
225c0 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
225d0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
225e0 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
225f0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
22600 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
22610 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
22620 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22630 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
22640 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e  e MemPage.pParen
22650 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65  t pointer on the
22660 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62   page whose numb
22670 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69  er is.** given i
22680 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  n the second arg
22690 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65  ument so that Me
226a0 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f  mPage.pParent ho
226b0 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74  lds the.** point
226c0 65 72 20 69 6e 20 74 68 65 20 74 68 69 72 64 20  er in the third 
226d0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
226e0 49 66 20 74 68 65 20 66 69 6e 61 6c 20 61 72 67  If the final arg
226f0 75 6d 65 6e 74 2c 20 75 70 64 61 74 65 50 74 72  ument, updatePtr
22700 6d 61 70 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  map, is non-zero
22710 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
22720 65 0a 2a 2a 20 69 73 20 61 6e 20 61 75 74 6f 2d  e.** is an auto-
22730 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
22740 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65   then the pointe
22750 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
22760 70 67 6e 6f 0a 2a 2a 20 69 73 20 75 70 64 61 74  pgno.** is updat
22770 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
22780 74 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 0a  t reparentPage(.
22790 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 2f 2a 20 42 2d 54 72 65 65 20 73 74 72 75 63 74  /* B-Tree struct
227c0 75 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ure */.  Pgno pg
227d0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
227e0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
227f0 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 62  umber of child b
22800 65 69 6e 67 20 61 64 6f 70 74 65 64 20 2a 2f 0a  eing adopted */.
22810 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
22820 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  arent,          
22830 2f 2a 20 4e 65 77 20 70 61 72 65 6e 74 20 6f 66  /* New parent of
22840 20 70 67 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20 69   pgno */.  int i
22850 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
22860 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
22870 78 20 6f 66 20 63 68 69 6c 64 20 70 61 67 65 20  x of child page 
22880 70 67 6e 6f 20 69 6e 20 70 4e 65 77 50 61 72 65  pgno in pNewPare
22890 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 75 70 64 61  nt */.  int upda
228a0 74 65 50 74 72 6d 61 70 20 20 20 20 20 20 20 20  tePtrmap        
228b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
228c0 2c 20 75 70 64 61 74 65 20 70 6f 69 6e 74 65 72  , update pointer
228d0 2d 6d 61 70 20 66 6f 72 20 70 67 6e 6f 20 2a 2f  -map for pgno */
228e0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
228f0 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a  This;.  DbPage *
22900 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
22910 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22920 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
22930 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
22940 70 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b  pNewParent!=0 );
22950 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
22960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22970 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  K;.  assert( pBt
22980 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
22990 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
229a0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
229b0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
229c0 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
229d0 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28  ){.    pThis = (
229e0 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
229f0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
22a00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
22a10 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 3d 3d   pThis->isInit==
22a20 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c  PAGE_ISINIT_FULL
22a30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22a40 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d  ( pThis->aData==
22a50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
22a60 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a  ata(pDbPage) );.
22a70 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
22a80 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61  >pParent!=pNewPa
22a90 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
22aa0 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
22ab0 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  nt ) sqlite3Page
22ac0 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50  rUnref(pThis->pP
22ad0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
22ae0 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e  .        pThis->
22af0 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61  pParent = pNewPa
22b00 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71  rent;.        sq
22b10 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 4e  lite3PagerRef(pN
22b20 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  ewParent->pDbPag
22b30 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
22b40 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65    pThis->idxPare
22b50 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a  nt = idx;.    }.
22b60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
22b70 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
22b80 20 20 7d 0a 0a 20 20 69 66 28 20 49 53 41 55 54    }..  if( ISAUT
22b90 4f 56 41 43 55 55 4d 20 26 26 20 75 70 64 61 74  OVACUUM && updat
22ba0 65 50 74 72 6d 61 70 20 29 7b 0a 20 20 20 20 72  ePtrmap ){.    r
22bb0 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28  eturn ptrmapPut(
22bc0 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  pBt, pgno, PTRMA
22bd0 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72  P_BTREE, pNewPar
22be0 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ent->pgno);.  }.
22bf0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
22c00 20 20 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61    /* If the upda
22c10 74 65 50 74 72 6d 61 70 20 66 6c 61 67 20 77 61  tePtrmap flag wa
22c20 73 20 63 6c 65 61 72 2c 20 61 73 73 65 72 74 20  s clear, assert 
22c30 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69  that the entry i
22c40 6e 20 74 68 65 0a 20 20 2a 2a 20 70 6f 69 6e 74  n the.  ** point
22c50 65 72 2d 6d 61 70 20 69 73 20 61 6c 72 65 61 64  er-map is alread
22c60 79 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  y correct..  */.
22c70 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
22c80 55 4d 20 29 7b 0a 20 20 20 20 70 44 62 50 61 67  UM ){.    pDbPag
22c90 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
22ca0 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
22cb0 65 72 2c 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  er,PTRMAP_PAGENO
22cc0 28 70 42 74 2c 70 67 6e 6f 29 29 3b 0a 20 20 20  (pBt,pgno));.   
22cd0 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
22ce0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
22cf0 20 20 20 20 20 20 50 67 6e 6f 20 69 69 3b 0a 20        Pgno ii;. 
22d00 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 70 74       int rc = pt
22d10 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
22d20 6f 2c 20 26 65 54 79 70 65 2c 20 26 69 69 29 3b  o, &eType, &ii);
22d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
22d40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22d50 69 69 3d 3d 70 4e 65 77 50 61 72 65 6e 74 2d 3e  ii==pNewParent->
22d60 70 67 6e 6f 20 26 26 20 65 54 79 70 65 3d 3d 50  pgno && eType==P
22d70 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
22d80 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
22d90 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
22da0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
22db0 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  f..  return SQLI
22dc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
22dd0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61  * Change the pPa
22de0 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  rent pointer of 
22df0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
22e00 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62  pPage to point b
22e10 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e  ack.** to pPage.
22e20 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
22e30 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79  words, for every
22e40 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c   child of pPage,
22e50 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74   invoke reparent
22e60 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b  Page().** to mak
22e70 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68  e sure that each
22e80 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61   child knows tha
22e90 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70  t pPage is its p
22ea0 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  arent..**.** Thi
22eb0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
22ec0 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20  alled after you 
22ed0 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67  memcpy() one pag
22ee0 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65  e into.** anothe
22ef0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 70 64 61  r..**.** If upda
22f00 74 65 50 74 72 6d 61 70 20 69 73 20 74 72 75 65  tePtrmap is true
22f10 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
22f20 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
22f30 6f 72 20 61 6c 6c 20 63 68 69 6c 64 0a 2a 2a 20  or all child.** 
22f40 70 61 67 65 73 20 6f 66 20 70 50 61 67 65 20 61  pages of pPage a
22f50 72 65 20 75 70 64 61 74 65 64 2e 0a 2a 2f 0a 73  re updated..*/.s
22f60 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65  tatic int repare
22f70 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d 65 6d  ntChildPages(Mem
22f80 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
22f90 20 75 70 64 61 74 65 50 74 72 6d 61 70 29 7b 0a   updatePtrmap){.
22fa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22fb0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
22fc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
22fd0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
22fe0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 21  utex) );.  if( !
22ff0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
23000 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
23010 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
23020 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67  age->pBt;.    Pg
23030 6e 6f 20 69 52 69 67 68 74 20 3d 20 67 65 74 34  no iRight = get4
23040 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
23050 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
23060 73 65 74 2b 38 5d 29 3b 0a 0a 20 20 20 20 66 6f  set+8]);..    fo
23070 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
23080 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
23090 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
230a0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
230b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  );.      rc = re
230c0 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
230d0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
230e0 20 70 50 61 67 65 2c 20 69 2c 20 75 70 64 61 74   pPage, i, updat
230f0 65 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  ePtrmap);.      
23100 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23110 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
23120 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65     }.    rc = re
23130 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
23140 69 52 69 67 68 74 2c 20 70 50 61 67 65 2c 20 69  iRight, pPage, i
23150 2c 20 75 70 64 61 74 65 50 74 72 6d 61 70 29 3b  , updatePtrmap);
23160 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53  .    pPage->idxS
23170 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  hift = 0;.  }.  
23180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23190 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
231a0 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
231b0 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
231c0 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
231d0 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
231e0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
231f0 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
23200 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
23210 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
23220 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
23230 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
23240 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
23250 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
23260 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
23270 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
23280 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
23290 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
232a0 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
232b0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
232c0 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
232d0 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
232e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
232f0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29  int idx, int sz)
23300 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
23310 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
23320 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
23330 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
23340 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
23350 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
23360 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
23370 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
23380 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
23390 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
233a0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
233b0 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
233c0 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
233d0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
233e0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
233f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
23400 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
23410 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
23420 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23430 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
23440 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
23450 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
23460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23470 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
23480 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
23490 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
234a0 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
234b0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
234c0 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
234d0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
234e0 20 61 73 73 65 72 74 28 20 70 63 3e 31 30 20 26   assert( pc>10 &
234f0 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e  & pc+sz<=pPage->
23500 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
23510 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70  );.  freeSpace(p
23520 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
23530 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c   for(i=idx+1; i<
23540 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
23550 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20  +, ptr+=2){.    
23560 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b  ptr[0] = ptr[2];
23570 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74  .    ptr[1] = pt
23580 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  r[3];.  }.  pPag
23590 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75  e->nCell--;.  pu
235a0 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
235b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
235c0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
235d0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
235e0 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69  += 2;.  pPage->i
235f0 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a  dxShift = 1;.}..
23600 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
23610 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
23620 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
23630 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
23640 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
23650 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
23660 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
23670 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
23680 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
23690 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
236a0 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
236b0 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
236c0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
236d0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
236e0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
236f0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
23700 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
23710 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
23720 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
23730 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
23740 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
23750 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
23760 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
23770 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
23780 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
23790 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
237a0 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
237b0 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
237c0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
237d0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
237e0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
237f0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
23800 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
23810 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
23820 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
23830 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
23840 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
23850 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
23860 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
23870 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
23880 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
23890 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
238a0 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
238b0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
238c0 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
238d0 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
238e0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
238f0 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
23900 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
23910 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
23920 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  int insertCell(.
23930 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
23940 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
23950 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
23960 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
23970 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
23980 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
23990 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
239a0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
239b0 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
239c0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
239d0 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
239e0 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
239f0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
23a00 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
23a10 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
23a20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
23a30 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
23a40 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
23a50 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70  ed */.  u8 nSkip
23a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
23a70 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69  not write the fi
23a80 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
23a90 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  of the cell */.)
23aa0 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  {.  int idx;    
23ab0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
23ac0 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
23ad0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
23ae0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
23af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
23b00 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
23b10 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
23b20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
23b30 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  f content for an
23b40 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d  y cell in data[]
23b50 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
23b60 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
23b70 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
23b80 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
23b90 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
23ba0 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
23bb0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
23bc0 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
23bd0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
23be0 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
23bf0 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
23c00 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61  * Offset into da
23c10 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65  ta[] of the page
23c20 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
23c30 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
23c40 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
23c50 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
23c60 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
23c70 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
23c80 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
23c90 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
23ca0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
23cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
23cc0 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
23cd0 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
23ce0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
23cf0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
23d00 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
23d10 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
23d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
23d30 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
23d40 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  ge, pCell) );.  
23d50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
23d60 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
23d70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
23d80 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
23d90 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
23da0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
23db0 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
23dc0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
23dd0 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c  emp+nSkip, pCell
23de0 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
23df0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
23e00 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
23e10 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
23e20 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
23e30 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70  sert( j<sizeof(p
23e40 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
23e50 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
23e60 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  [0]) );.    pPag
23e70 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
23e80 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
23e90 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
23ea0 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67  dx = i;.    pPag
23eb0 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  e->nFree = 0;.  
23ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
23ed0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
23ee0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
23ef0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
23f00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23f10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23f20 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23f30 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
23f40 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
23f50 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
23f60 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
23f70 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d  aData;.    hdr =
23f80 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
23f90 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  t;.    top = get
23fa0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
23fb0 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  5]);.    cellOff
23fc0 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
23fd0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
23fe0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
23ff0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b  2*pPage->nCell +
24000 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65   2;.    ins = ce
24010 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
24020 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f      if( end > to
24030 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20  p - sz ){.      
24040 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
24050 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 6f 70  Page);.      top
24060 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
24070 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
24080 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
24090 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
240a0 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
240b0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
240c0 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
240d0 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
240e0 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
240f0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
24100 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67  +5]) );.    pPag
24110 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
24120 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
24130 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  2;.    memcpy(&d
24140 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
24150 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
24160 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28  nSkip);.    for(
24170 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61  j=end-2, ptr=&da
24180 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
24190 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
241a0 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
241b0 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
241c0 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
241d0 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
241e0 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
241f0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
24200 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
24210 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
24220 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
24230 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
24240 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24250 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
24260 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
24270 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
24280 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
24290 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
242a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
242b0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
242c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
242d0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
242e0 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
242f0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
24300 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65       */.      Ce
24310 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
24320 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
24330 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
24340 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
24350 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24360 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
24370 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
24380 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
24390 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20  Payload );.     
243a0 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61   if( (info.nData
243b0 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
243c0 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e  0:info.nKey))>in
243d0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
243e0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76       Pgno pgnoOv
243f0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
24400 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
24410 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  low]);.        r
24420 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50  c = ptrmapPut(pP
24430 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76  age->pBt, pgnoOv
24440 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
24450 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
24460 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
24470 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
24480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
24490 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
244a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
244b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
244c0 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
244d0 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
244e0 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
244f0 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
24500 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
24510 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
24520 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
24530 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
24540 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
24550 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
24560 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
24570 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
24580 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
24590 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
245a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
245b0 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
245c0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
245d0 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
245e0 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
245f0 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
24600 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
24610 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
24620 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
24630 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
24640 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
24650 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a  /.  int totalSiz
24660 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  e;    /* Total s
24670 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
24680 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
24690 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
246a0 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
246b0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72  */.  int cellptr
246c0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
246d0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70  s of next cell p
246e0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
246f0 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a  cellbody;     /*
24700 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
24710 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20   cell body */.  
24720 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
24730 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68    /* Data for th
24740 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73  e page */..  ass
24750 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
24760 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
24770 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24780 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
24790 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
247a0 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a   totalSize = 0;.
247b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
247c0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f  ll; i++){.    to
247d0 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65  talSize += aSize
247e0 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  [i];.  }.  asser
247f0 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e  t( totalSize+2*n
24800 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72  Cell<=pPage->nFr
24810 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ee );.  assert( 
24820 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
24830 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70  );.  cellptr = p
24840 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
24850 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
24860 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
24870 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
24880 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  t;.  put2byte(&d
24890 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c  ata[hdr+3], nCel
248a0 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20  l);.  if( nCell 
248b0 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  ){.    cellbody 
248c0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
248d0 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65  pPage, totalSize
248e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  );.    assert( c
248f0 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20  ellbody>0 );.   
24900 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
24910 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c  nFree >= 2*nCell
24920 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
24930 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b  Free -= 2*nCell;
24940 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24950 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
24960 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
24970 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c  a[cellptr], cell
24980 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d  body);.      mem
24990 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
249a0 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
249b0 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20  aSize[i]);.     
249c0 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20   cellptr += 2;. 
249d0 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d       cellbody +=
249e0 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d   aSize[i];.    }
249f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c  .    assert( cel
24a00 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42  lbody==pPage->pB
24a10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
24a20 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
24a30 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a  ell = nCell;.}..
24a40 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
24a50 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64  ing parameters d
24a60 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e  etermine how man
24a70 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73  y adjacent pages
24a80 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a   get involved.**
24a90 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20   in a balancing 
24aa0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69  operation.  NN i
24ab0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
24ac0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
24ad0 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74  her side.** of t
24ae0 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72  he page that par
24af0 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
24b00 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
24b10 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a  ion.  NB is the.
24b20 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  ** total number 
24b30 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61  of pages that pa
24b40 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75  rticipate, inclu
24b50 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20  ding the target 
24b60 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e  page and.** NN n
24b70 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
24b80 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  er side..**.** T
24b90 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  he minimum value
24ba0 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20   of NN is 1 (of 
24bb0 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61  course).  Increa
24bc0 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a  sing NN above 1.
24bd0 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67  ** (to 2 or 3) g
24be0 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d  ives a modest im
24bf0 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c  provement in SEL
24c00 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70  ECT and DELETE p
24c10 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e  erformance.** in
24c20 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20   exchange for a 
24c30 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69  larger degradati
24c40 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64  on in INSERT and
24c50 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61   UPDATE performa
24c60 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  nce..** The valu
24c70 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20  e of NN appears 
24c80 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74  to give the best
24c90 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c   results overall
24ca0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20  ..*/.#define NN 
24cb0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1             /*
24cc0 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   Number of neigh
24cd0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
24ce0 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ide of pPage */.
24cf0 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32  #define NB (NN*2
24d00 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  +1)      /* Tota
24d10 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64  l pages involved
24d20 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20   in the balance 
24d30 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
24d40 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
24d50 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d  ic int balance(M
24d60 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a  emPage*, int);..
24d70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24d80 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
24d90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
24da0 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
24db0 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
24dc0 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
24dd0 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
24de0 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
24df0 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
24e00 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
24e10 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
24e20 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
24e30 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
24e40 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
24e50 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
24e60 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
24e70 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
24e80 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63  of trying balanc
24e90 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
24ea0 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
24eb0 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
24ec0 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
24ed0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
24ee0 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
24ef0 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
24f00 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
24f10 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
24f20 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
24f30 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
24f40 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
24f50 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
24f60 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
24f70 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
24f80 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
24f90 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
24fa0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
24fb0 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
24fc0 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
24fd0 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
24fe0 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
24ff0 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
25000 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
25010 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
25020 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
25030 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
25040 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
25050 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
25060 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
25070 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
25080 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
25090 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
250a0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
250b0 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  k(MemPage *pPage
250c0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  , MemPage *pPare
250d0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
250e0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
250f0 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   0;.  Pgno pgnoN
25100 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ew;.  u8 *pCell;
25110 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20  .  u16 szCell;. 
25120 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
25130 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
25140 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
25150 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20  int parentIdx = 
25160 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
25170 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77    /* pParent new
25180 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
25190 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  dex */.  int par
251a0 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  entSize;        
251b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
251c0 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65  ze of new divide
251d0 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70  r cell */.  u8 p
251e0 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20  arentCell[64];  
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25200 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   Space for the n
25210 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
25220 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
25230 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25240 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
25250 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ex) );..  /* All
25260 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
25270 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65  . Insert the ove
25280 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
25290 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20  pPage.  ** into 
252a0 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20  it. Then remove 
252b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
252c0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20  l from pPage..  
252d0 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
252e0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
252f0 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
25300 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
25310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25320 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67      pCell = pPag
25330 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
25340 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20  l;.    szCell = 
25350 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
25360 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7a  e, pCell);.    z
25370 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50  eroPage(pNew, pP
25380 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  age->aData[0]);.
25390 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
253a0 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
253b0 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  , &szCell);.    
253c0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
253d0 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 0;.  .    /* 
253e0 53 65 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f  Set the parent o
253f0 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  f the newly allo
25400 63 61 74 65 64 20 70 61 67 65 20 74 6f 20 70 50  cated page to pP
25410 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 4e  arent. */.    pN
25420 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ew->pParent = pP
25430 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
25440 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
25450 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
25460 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73  .    /* pPage is
25470 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
25480 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
25490 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68  arent. Change th
254a0 69 73 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  is.    ** so tha
254b0 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
254c0 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67  d is the new pag
254d0 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76  e allocated abov
254e0 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50 61  e and.    ** pPa
254f0 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74  ge is the next-t
25500 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a  o-right child. .
25510 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 67      **.    ** Ig
25520 6e 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e 20  nore the return 
25530 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 61 6c  value of the cal
25540 6c 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  l to fillInCell(
25550 29 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a  ). fillInCell().
25560 20 20 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20      ** may only 
25570 72 65 74 75 72 6e 20 6f 74 68 65 72 20 74 68 61  return other tha
25580 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69  n SQLITE_OK if i
25590 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  t is required to
255a0 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a   allocate.    **
255b0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
255c0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 53 69 6e  rflow pages. Sin
255d0 63 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ce an internal t
255e0 61 62 6c 65 20 42 2d 54 72 65 65 20 63 65 6c 6c  able B-Tree cell
255f0 20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65 76   .    ** may nev
25600 65 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e  er spill over on
25610 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
25620 61 67 65 20 28 69 74 20 69 73 20 61 20 6d 61 78  age (it is a max
25630 69 6d 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a 20  imum of .    ** 
25640 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
25650 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ), it is not nec
25660 63 65 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b  cessary to check
25670 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
25680 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
25690 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 69  Similarly, the i
256a0 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e 63  nsertCell() func
256b0 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
256c0 20 69 66 20 74 68 65 20 70 61 67 65 0a 20 20 20   if the page.   
256d0 20 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74   ** being insert
256e0 65 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61  ed into is alrea
256f0 64 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20  dy writable and 
25700 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f  the cell does no
25710 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  t .    ** contai
25720 6e 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f  n an overflow po
25730 69 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65  inter. So ignore
25740 20 74 68 69 73 20 72 65 74 75 72 6e 20 63 6f 64   this return cod
25750 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  e too..    */.  
25760 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25770 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
25780 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
25790 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
257a0 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Cell-1);.    sql
257b0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
257c0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
257d0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
257e0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
257f0 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  nt, parentCell, 
25800 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c  0, info.nKey, 0,
25810 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69   0, 0, &parentSi
25820 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ze);.    assert(
25830 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29   parentSize<64 )
25840 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
25850 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
25860 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
25870 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 69  DbPage) );.    i
25880 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
25890 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61  t, parentIdx, pa
258a0 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74  rentCell, parent
258b0 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 20  Size, 0, 4);.   
258c0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
258d0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
258e0 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70  nt,parentIdx), p
258f0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
25900 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
25910 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
25920 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
25930 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
25940 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
25950 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
25960 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
25970 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
25980 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
25990 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
259a0 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
259b0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
259c0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
259d0 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
259e0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20  erflow page..   
259f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
25a00 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
25a10 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
25a20 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
25a30 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
25a40 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  rent->pgno);.   
25a50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25a70 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
25a80 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20  fl(pNew, 0);.   
25a90 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
25aa0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
25ab0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
25ac0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
25ad0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
25ae0 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  w);.  }..  /* At
25af0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
25b00 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 76 61 72  pPage->nFree var
25b10 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74  iable is not set
25b20 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68 0a   correctly with.
25b30 20 20 2a 2a 20 72 65 73 70 65 63 74 20 74 6f 20    ** respect to 
25b40 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
25b50 68 65 20 70 61 67 65 20 28 62 65 63 61 75 73 65  he page (because
25b60 20 69 74 20 77 61 73 20 73 65 74 20 74 6f 20 30   it was set to 0
25b70 20 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74   by .  ** insert
25b80 43 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73  Cell). So call s
25b90 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
25ba0 61 67 65 28 29 20 74 6f 20 6d 61 6b 65 20 73 75  age() to make su
25bb0 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f  re it is.  ** co
25bc0 72 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rrect..  **.  **
25bd0 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20   This has to be 
25be0 64 6f 6e 65 20 65 76 65 6e 20 69 66 20 61 6e 20  done even if an 
25bf0 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
25c00 74 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79  turned. Normally
25c10 2c 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  , if.  ** an err
25c20 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
25c30 20 74 72 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c   tree balancing,
25c40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
25c50 20 4d 65 6d 50 61 67 65 20 61 72 65 0a 20 20 2a   MemPage are.  *
25c60 2a 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c  * not important,
25c70 20 61 73 20 74 68 65 79 20 77 69 6c 6c 20 62 65   as they will be
25c80 20 72 65 63 61 6c 63 75 6c 61 74 65 64 20 77 68   recalculated wh
25c90 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 72  en the page is r
25ca0 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e  olled.  ** back.
25cb0 20 42 75 74 20 68 65 72 65 2c 20 69 6e 20 62 61   But here, in ba
25cc0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20 69  lance_quick(), i
25cd0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
25ce0 61 74 20 70 50 61 67 65 20 68 61 73 20 0a 20 20  at pPage has .  
25cf0 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
25d00 6d 61 72 6b 65 64 20 64 69 72 74 79 20 6f 72 20  marked dirty or 
25d10 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
25d20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
25d30 68 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74  herefore.  ** it
25d40 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c   will not be rol
25d50 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 73 6f 20  led back and so 
25d60 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
25d70 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
25d80 74 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  t.  ** the page 
25d90 64 61 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74  data and content
25da0 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65  s of MemPage are
25db0 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a   consistent..  *
25dc0 2f 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  /.  pPage->isIni
25dd0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
25de0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
25df0 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  age, pPage->pPar
25e00 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ent);.  sqlite3P
25e10 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
25e20 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  >pParent->pDbPag
25e30 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65  e);..  /* If eve
25e40 72 79 74 68 69 6e 67 20 65 6c 73 65 20 73 75 63  rything else suc
25e50 63 65 65 64 65 64 2c 20 62 61 6c 61 6e 63 65 20  ceeded, balance 
25e60 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
25e70 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65 20 74   in .  ** case t
25e80 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
25e90 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20  inserted caused 
25ea0 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  it to become ove
25eb0 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  rfull..  */.  if
25ec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25ed0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  ){.    rc = bala
25ee0 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b  nce(pParent, 0);
25ef0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25f00 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
25f10 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
25f20 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ALANCE */../*.**
25f30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
25f40 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c  distributes Cell
25f50 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75  s on pPage and u
25f60 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e  p to NN*2 siblin
25f70 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
25f80 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
25f90 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
25fa0 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
25fb0 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
25fc0 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67  ually NN sibling
25fd0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
25fe0 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
25ff0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
26000 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f  ng,.** though mo
26010 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  re siblings migh
26020 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
26030 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
26040 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
26050 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
26060 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
26070 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
26080 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67  han 2*NN sibling
26090 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20  s.** (something 
260a0 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
260b0 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69  appen if pPage i
260c0 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
260d0 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f  or a .** child o
260e0 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c  f root) then all
260f0 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
26100 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20  ngs participate 
26110 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
26120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
26130 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
26140 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65  f pPage might be
26150 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
26160 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f  creased by one o
26170 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65  r.** two in an e
26180 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
26190 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
261a0 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
261b0 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  l. The root page
261c0 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61  .** is special a
261d0 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  nd is allowed to
261e0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
261f0 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a  . If pPage is .*
26200 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  * the root page,
26210 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20   then the depth 
26220 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68  of the tree migh
26230 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a  t be increased.*
26240 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  * or decreased b
26250 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73  y one, as necess
26260 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65  ary, to keep the
26270 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20   root page from 
26280 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c  being.** overful
26290 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l or completely 
262a0 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  empty..**.** Not
262b0 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
262c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
262d0 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
262e0 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a  Cells on pPage.*
262f0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
26300 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
26310 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
26320 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
26330 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
26340 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20  e is overfull.  
26350 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20  Part of the job 
26360 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
26370 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  is to.** make su
26380 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72  re all Cells for
26390 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69   pPage once agai
263a0 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e  n fit in pPage->
263b0 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49  aData[]..**.** I
263c0 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
263d0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69  balancing the si
263e0 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c  blings of pPage,
263f0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   the parent of p
26400 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  Page.** might be
26410 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
26420 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20   underfull.  If 
26430 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68  that happens, th
26440 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
26450 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ** is called rec
26460 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20  ursively on the 
26470 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  parent..**.** If
26480 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
26490 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
264a0 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
264b0 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
264c0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
264d0 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20  d state.  So if 
264e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
264f0 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
26500 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
26510 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
26520 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
26530 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65  _nonroot(MemPage
26540 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
26550 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  age *pParent;   
26560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26570 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20  parent of pPage 
26580 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
26590 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
265a0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
265b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
265c0 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
265d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
265e0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
265f0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
26600 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
26610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
26620 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
26630 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
26640 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
26650 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
26660 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26670 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
26680 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
26690 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
266a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
266b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
266c0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
266d0 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  nDiv;           
266e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
266f0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
26700 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pDiv[] */.  int 
26710 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
26720 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
26730 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
26740 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
26750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26760 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e  ndex of pPage in
26770 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
26780 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76  ] */.  int nxDiv
26790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
267a0 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69      /* Next divi
267b0 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72  der slot in pPar
267c0 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
267d0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
267f0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
26800 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43  e */.  int leafC
26810 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  orrection;      
26820 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67      /* 4 if pPag
26830 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
26840 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  if not */.  int 
26850 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
26860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26870 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
26880 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54  eaf of a LEAFDAT
26890 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  A tree */.  int 
268a0 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20  usableSpace;    
268b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
268c0 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e  s in pPage beyon
268d0 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  d the header */.
268e0 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b    int pageFlags;
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26900 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65  * Value of pPage
26910 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20  ->aData[0] */.  
26920 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
26930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26940 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
26950 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
26960 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
26970 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20  iSpace1 = 0;    
26980 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
26990 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
269a0 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20   aSpace1[] */.  
269b0 69 6e 74 20 69 53 70 61 63 65 32 20 3d 20 30 3b  int iSpace2 = 0;
269c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
269d0 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
269e0 65 20 6f 66 20 61 53 70 61 63 65 32 5b 5d 20 2a  e of aSpace2[] *
269f0 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63  /.  int szScratc
26a00 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
26a10 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61   /* Size of scra
26a20 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65  tch memory reque
26a30 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  sted */.  MemPag
26a40 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20  e *apOld[NB];   
26a50 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
26a60 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69  and up to two si
26a70 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  blings */.  Pgno
26a80 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20   pgnoOld[NB];   
26a90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
26aa0 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
26ab0 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b  h page in apOld[
26ac0 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
26ad0 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
26ae0 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
26af0 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
26b00 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
26b10 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
26b20 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
26b30 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
26b40 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
26b50 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e  lancing */.  Pgn
26b60 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b  o pgnoNew[NB+2];
26b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26b80 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61  e numbers for ea
26b90 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77  ch page in apNew
26ba0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  [] */.  u8 *apDi
26bb0 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  v[NB];          
26bc0 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
26bd0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
26be0 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
26bf0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
26c00 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
26c10 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
26c20 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
26c30 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
26c40 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
26c50 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
26c60 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
26c70 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
26c80 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
26c90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26ca0 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
26cb0 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
26cc0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ce0 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
26cf0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
26d00 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43  ll[] */.  u8 *aC
26d10 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
26d20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f   /* Space for ho
26d30 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70  lding data of ap
26d40 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Copy[] */.  u8 *
26d50 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
26d60 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
26d70 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65  copies of divide
26d80 72 73 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  rs cells before 
26d90 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20  balance */.  u8 
26da0 2a 61 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20  *aSpace2 = 0;   
26db0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
26dc0 20 6f 76 65 72 66 6c 6f 77 20 64 69 76 69 64 65   overflow divide
26dd0 72 73 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62  rs cells after b
26de0 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a  alance */.  u8 *
26df0 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20 20 61 73  aFrom = 0;..  as
26e00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
26e10 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
26e20 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
26e30 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20    /* .  ** Find 
26e40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
26e50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26e60 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 50  pPage->isInit==P
26e70 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20  AGE_ISINIT_FULL 
26e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
26e90 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
26ea0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
26eb0 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  age) || pPage->n
26ec0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
26ed0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
26ee0 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
26ef0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
26f00 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
26f10 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
26f20 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
26f30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
26f40 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20  rent->pDbPage)) 
26f50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
26f60 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 28 28  ;.  }..  TRACE((
26f70 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20  "BALANCE: begin 
26f80 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66  page %d child of
26f90 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
26fa0 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  gno, pParent->pg
26fb0 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  no));..#ifndef S
26fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
26fd0 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  BALANCE.  /*.  *
26fe0 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65  * A special case
26ff0 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72  :  If a new entr
27000 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  y has just been 
27010 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a  inserted into a.
27020 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74    ** table (that
27030 20 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74   is, a btree wit
27040 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61  h integer keys a
27050 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74  nd all data at t
27060 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20  he leaves).  ** 
27070 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72  and the new entr
27080 79 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  y is the right-m
27090 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ost entry in the
270a0 20 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68   tree (it has th
270b0 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b  e.  ** largest k
270c0 65 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65  ey) then use the
270d0 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65   special balance
270e0 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65  _quick() routine
270f0 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63   for.  ** balanc
27100 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75  ing.  balance_qu
27110 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61  ick() is much fa
27120 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73  ster and results
27130 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20   in a tighter.  
27140 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61  ** packing of da
27150 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ta in the common
27160 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   case..  */.  if
27170 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26  ( pPage->leaf &&
27180 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
27190 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50  tKey &&.      pP
271a0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
271b0 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  1 &&.      pPage
271c0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
271d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a  pPage->nCell &&.
271e0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
271f0 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
27200 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
27210 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
27220 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
27230 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
27240 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  gno.  ){.    ass
27250 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
27260 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20  ey );.    /*.   
27270 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   ** TODO: Check 
27280 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20  the siblings to 
27290 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67  the left of pPag
272a0 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61  e. It may be tha
272b0 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72  t.    ** they ar
272c0 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e  e not full and n
272d0 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65  o new page is re
272e0 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
272f0 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63     return balanc
27300 65 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70  e_quick(pPage, p
27310 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  Parent);.  }.#en
27320 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  dif..  if( SQLIT
27330 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
27340 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
27350 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29  age->pDbPage)) )
27360 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
27370 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27380 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e  Find the cell in
27390 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
273a0 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c   whose left chil
273b0 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20  d points back.  
273c0 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68  ** to pPage.  Th
273d0 65 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65  e "idx" variable
273e0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
273f0 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20   that cell.  If 
27400 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68  pPage.  ** is th
27410 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c  e rightmost chil
27420 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65  d of pParent the
27430 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61  n set idx to pPa
27440 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a  rent->nCell .  *
27450 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d  /.  if( pParent-
27460 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20  >idxShift ){.   
27470 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
27480 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
27490 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
274a0 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
274b0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
274c0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
274d0 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69      for(idx=0; i
274e0 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  dx<pParent->nCel
274f0 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20  l; idx++){.     
27500 20 69 66 28 20 67 65 74 34 62 79 74 65 28 66 69   if( get4byte(fi
27510 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
27520 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20  idx))==pgno ){. 
27530 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27540 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27550 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 72  assert( idx<pPar
27560 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20  ent->nCell.     
27570 20 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62          || get4b
27580 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
27590 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
275a0 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f  Offset+8])==pgno
275b0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
275c0 20 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64   idx = pPage->id
275d0 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20  xParent;.  }..  
275e0 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  /*.  ** Initiali
275f0 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20  ze variables so 
27600 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
27610 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a  safe to jump.  *
27620 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61  * directly to ba
27630 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74  lance_cleanup at
27640 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a   any moment..  *
27650 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20  /.  nOld = nNew 
27660 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  = 0;.  sqlite3Pa
27670 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e  gerRef(pParent->
27680 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a  pDbPage);..  /*.
27690 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e    ** Find siblin
276a0 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65  g pages to pPage
276b0 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69   and the cells i
276c0 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64  n pParent that d
276d0 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73  ivide.  ** the s
276e0 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74  iblings.  An att
276f0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
27700 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
27710 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20   on either.  ** 
27720 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20  side of pPage.  
27730 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
27740 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
27750 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
27760 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68  if.  ** pPage th
27770 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
27780 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
27790 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
277a0 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20  .  If pParent.  
277b0 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77  ** has NB or few
277c0 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e  er children then
277d0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
277e0 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b   pParent are tak
277f0 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76  en..  */.  nxDiv
27800 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69   = idx - NN;.  i
27810 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20  f( nxDiv + NB > 
27820 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
27830 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50  {.    nxDiv = pP
27840 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e  arent->nCell - N
27850 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  B + 1;.  }.  if(
27860 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20   nxDiv<0 ){.    
27870 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20  nxDiv = 0;.  }. 
27880 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72   nDiv = 0;.  for
27890 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69  (i=0, k=nxDiv; i
278a0 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a  <NB; i++, k++){.
278b0 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e      if( k<pParen
278c0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
278d0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
278e0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b  dCell(pParent, k
278f0 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b  );.      nDiv++;
27900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
27910 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b  pParent->leaf );
27920 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
27930 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  ] = get4byte(apD
27940 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  iv[i]);.    }els
27950 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74  e if( k==pParent
27960 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
27970 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
27980 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
27990 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
279a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
279b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
279c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
279d0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
279e0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c  Page(pBt, pgnoOl
279f0 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  d[i], &apOld[i],
27a00 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69   pParent);.    i
27a10 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
27a20 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
27a30 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50    apOld[i]->idxP
27a40 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61  arent = k;.    a
27a50 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20  pCopy[i] = 0;.  
27a60 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c    assert( i==nOl
27a70 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b  d );.    nOld++;
27a80 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
27a90 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
27aa0 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
27ab0 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20  verflow;.  }..  
27ac0 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
27ad0 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
27ae0 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  4 in order to pr
27af0 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
27b00 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
27b10 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
27b20 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33  MaxCells + 3)&~3
27b30 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
27b40 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
27b50 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
27b60 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74  s.  */.  szScrat
27b70 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78  ch =.       nMax
27b80 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a  Cells*sizeof(u8*
27b90 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
27ba0 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
27bb0 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
27bc0 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36  Cells*sizeof(u16
27bd0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
27be0 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
27bf0 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55  l */.     + (ROU
27c00 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
27c10 67 65 29 29 2b 70 42 74 2d 3e 70 61 67 65 53 69  ge))+pBt->pageSi
27c20 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79  ze)*NB  /* aCopy
27c30 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e   */.     + pBt->
27c40 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20  pageSize        
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c60 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65         /* aSpace
27c70 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41  1 */.     + (ISA
27c80 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78  UTOVACUUM ? nMax
27c90 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20 20 20  Cells : 0);     
27ca0 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d          /* aFrom
27cb0 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
27cc0 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
27cd0 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29  loc( szScratch )
27ce0 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  ; .  if( apCell=
27cf0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
27d00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
27d10 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
27d20 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
27d30 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
27d40 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
27d50 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38    aCopy[0] = (u8
27d60 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
27d70 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
27d80 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38  ((aCopy[0] - (u8
27d90 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d  *)apCell) & 7)==
27da0 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
27db0 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
27dc0 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20  d */.  for(i=1; 
27dd0 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<NB; i++){.    
27de0 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70  aCopy[i] = &aCop
27df0 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  y[i-1][pBt->page
27e00 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
27e10 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
27e20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f     assert( ((aCo
27e30 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[i] - (u8*)apC
27e40 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
27e50 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
27e60 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
27e70 20 20 7d 0a 20 20 61 53 70 61 63 65 31 20 3d 20    }.  aSpace1 = 
27e80 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74  &aCopy[NB-1][pBt
27e90 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
27ea0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
27eb0 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ))];.  assert( (
27ec0 28 61 53 70 61 63 65 31 20 2d 20 28 75 38 2a 29  (aSpace1 - (u8*)
27ed0 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
27ee0 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
27ef0 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
27f00 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
27f10 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 61 46 72  ACUUM ){.    aFr
27f20 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42  om = &aSpace1[pB
27f30 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
27f40 7d 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73 71  }.  aSpace2 = sq
27f50 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
27f60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
27f70 20 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d 30    if( aSpace2==0
27f80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
27f90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
27fa0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
27fb0 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  nup;.  }.  .  /*
27fc0 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  .  ** Make copie
27fd0 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  s of the content
27fe0 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74   of pPage and it
27ff0 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20  s siblings into 
28000 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65  aOld[]..  ** The
28010 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
28020 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
28030 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
28040 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a  pies rather.  **
28050 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
28060 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
28070 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
28080 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
28090 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66  .  ** process of
280a0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
280b0 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  en..  */.  for(i
280c0 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
280d0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
280e0 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
280f0 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69  MemPage*)aCopy[i
28100 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ];.    memcpy(p,
28110 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
28120 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
28130 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69   p->aData = (voi
28140 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65  d*)&p[1];.    me
28150 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61  mcpy(p->aData, a
28160 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20  pOld[i]->aData, 
28170 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
28180 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c    }..  /*.  ** L
28190 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
281a0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
281b0 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
281c0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
281d0 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
281e0 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
281f0 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
28200 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
28210 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
28220 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
28230 66 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  form aSpace1[] a
28240 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
28250 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
28260 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
28270 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
28280 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
28290 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
282a0 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
282b0 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
282c0 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
282d0 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
282e0 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
282f0 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
28300 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
28310 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
28320 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
28330 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
28340 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
28350 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
28360 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
28370 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
28380 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
28390 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
283a0 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
283b0 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
283c0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
283d0 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
283e0 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
283f0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
28400 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
28410 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
28420 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
28430 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
28440 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
28450 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
28460 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
28470 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
28480 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b   */.  nCell = 0;
28490 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
284a0 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a  n = pPage->leaf*
284b0 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
284c0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a  pPage->hasData;.
284d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
284e0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
284f0 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
28500 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[i];.    int 
28510 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
28520 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
28530 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
28540 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
28550 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
28560 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
28570 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
28580 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
28590 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
285a0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
285b0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
285c0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
285d0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
285e0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
285f0 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  M ){.        int
28600 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f   a;.        aFro
28610 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20  m[nCell] = i;.  
28620 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61        for(a=0; a
28630 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  <pOld->nOverflow
28640 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; a++){.        
28650 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66    if( pOld->aOvf
28660 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65  l[a].pCell==apCe
28670 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20  ll[nCell] ){.   
28680 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
28690 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
286a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
286b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
286c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
286d0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
286e0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
286f0 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 75 31  ld-1 ){.      u1
28700 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  6 sz = cellSizeP
28710 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
28720 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
28730 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
28740 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
28750 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
28760 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
28770 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
28780 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
28790 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
287a0 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
287b0 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
287c0 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
287d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
287e0 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
287f0 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
28800 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
28810 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
28820 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
28830 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
28840 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
28850 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
28860 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
28870 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
28880 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
28890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
288a0 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
288b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
288c0 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
288d0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
288e0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
288f0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
28900 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
28910 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  1];.        iSpa
28920 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce1 += sz;.     
28930 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
28940 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
28950 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
28960 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
28970 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
28980 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
28990 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
289a0 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
289b0 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c  nCell] = pTemp+l
289c0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
289d0 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54         if( ISAUT
289e0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
289f0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
28a00 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
28a10 20 20 7d 0a 20 20 20 20 20 20 20 20 64 72 6f 70    }.        drop
28a20 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
28a30 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
28a40 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
28a50 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  -= leafCorrectio
28a60 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
28a70 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d  t( get4byte(pTem
28a80 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29  p)==pgnoOld[i] )
28a90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
28aa0 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
28ab0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
28ac0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
28ad0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
28ae0 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
28af0 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
28b00 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
28b10 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
28b20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
28b30 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
28b40 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ell */.         
28b50 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
28b60 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
28b70 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  ata[pOld->hdrOff
28b80 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  set+8], 4);.    
28b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28ba0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
28bb0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
28bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28bd0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
28be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
28bf0 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
28c00 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
28c10 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
28c20 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  /.            sz
28c30 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
28c40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
28c60 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
28c70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
28c80 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
28c90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
28ca0 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
28cb0 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
28cc0 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
28cd0 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
28ce0 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
28cf0 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
28d00 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
28d10 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
28d20 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
28d30 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
28d40 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
28d50 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
28d60 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
28d70 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
28d80 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
28d90 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
28da0 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
28db0 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
28dc0 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
28dd0 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
28de0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
28df0 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
28e00 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
28e10 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
28e20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
28e30 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
28e40 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
28e50 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
28e60 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
28e70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
28e80 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
28e90 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
28eb0 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
28ec0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
28ed0 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
28ee0 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
28ef0 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
28f00 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
28f10 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
28f20 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
28f30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
28f40 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
28f50 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
28f60 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
28f70 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
28f80 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
28f90 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
28fa0 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
28fb0 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
28fc0 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
28fd0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
28fe0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
28ff0 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
29000 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
29010 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
29020 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
29030 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
29040 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
29050 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e  .    }.  }.  szN
29060 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
29070 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20  ;.  cntNew[k] = 
29080 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20  nCell;.  k++;.. 
29090 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63   /*.  ** The pac
290a0 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79  king computed by
290b0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c   the previous bl
290c0 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f  ock is biased to
290d0 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67  ward the sibling
290e0 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  s.  ** on the le
290f0 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65  ft side.  The le
29100 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  ft siblings are 
29110 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75  always nearly fu
29120 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20  ll, while the.  
29130 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  ** right-most si
29140 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e  bling might be n
29150 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  early empty.  Th
29160 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  is block of code
29170 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74   attempts.  ** t
29180 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63  o adjust the pac
29190 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73  king of siblings
291a0 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
291b0 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20   balance..  **. 
291c0 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d   ** This adjustm
291d0 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ent is more than
291e0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
291f0 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61  .  The packing a
29200 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20  bove might.  ** 
29210 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c  be so out of bal
29220 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c  ance as to be il
29230 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d  legal.  For exam
29240 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d  ple, the right-m
29250 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67  ost.  ** sibling
29260 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65   might be comple
29270 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  tely empty.  Thi
29280 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
29290 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20  not optional..  
292a0 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20  */.  for(i=k-1; 
292b0 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  i>0; i--){.    i
292c0 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e  nt szRight = szN
292d0 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20  ew[i];  /* Size 
292e0 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
292f0 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69  e right */.    i
29300 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65  nt szLeft = szNe
29310 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20  w[i-1]; /* Size 
29320 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
29330 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e  e left */.    in
29340 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  t r;            
29350 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
29360 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e  ght-most cell in
29370 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f   left sibling */
29380 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20  .    int d;     
29390 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
293a0 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
293b0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72  to the left of r
293c0 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight sibling */.
293d0 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b  .    r = cntNew[
293e0 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20  i-1] - 1;.    d 
293f0 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
29400 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
29410 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  d<nMaxCells );. 
29420 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61     assert( r<nMa
29430 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68  xCells );.    wh
29440 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20  ile( szRight==0 
29450 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  || szRight+szCel
29460 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
29470 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a  szCell[r]+2) ){.
29480 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
29490 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
294a0 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
294b0 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
294c0 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
294d0 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
294e0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
294f0 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
29500 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
29510 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
29520 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
29530 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
29540 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
29550 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
29560 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
29570 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
29580 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20  we are the.  ** 
29590 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
295a0 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
295b0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
295c0 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
295d0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
295e0 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
295f0 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
29600 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
29610 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
29620 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
29630 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
29640 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
29650 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
29660 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
29670 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
29680 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
29690 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  sible..  */.  as
296a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
296b0 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61  o>1 );.  pageFla
296c0 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  gs = pPage->aDat
296d0 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
296e0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
296f0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
29700 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
29710 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
29720 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
29730 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
29740 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d  [i] = pgnoOld[i]
29750 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
29760 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
29770 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29780 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
29790 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
297a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
297b0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
297c0 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
297d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
297e0 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
297f0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
29800 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
29810 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f  pgnoNew[i], pgno
29820 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20  New[i-1], 0);.  
29830 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
29840 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29850 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
29860 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
29870 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nNew++;.    }.  
29880 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
29890 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
298a0 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
298b0 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
298c0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
298d0 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ld ){.    rc = f
298e0 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
298f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
29900 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
29910 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
29920 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
29930 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
29940 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
29950 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
29960 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
29970 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
29980 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
29990 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
299a0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
299b0 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
299c0 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
299d0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
299e0 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
299f0 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
29a00 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
29a10 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
29a20 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
29a30 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
29a40 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
29a50 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
29a60 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
29a70 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
29a80 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
29a90 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
29aa0 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
29ab0 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
29ac0 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
29ad0 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
29ae0 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
29af0 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
29b00 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
29b10 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
29b20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
29b30 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
29b40 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
29b50 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
29b60 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
29b70 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
29b80 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
29b90 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77  t minV = pgnoNew
29ba0 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  [i];.    int min
29bb0 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
29bc0 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
29bd0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e  .      if( pgnoN
29be0 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29  ew[j]<(unsigned)
29bf0 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
29c00 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
29c10 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77    minV = pgnoNew
29c20 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [j];.      }.   
29c30 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
29c40 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  i ){.      int t
29c50 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  ;.      MemPage 
29c60 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70  *pT;.      t = p
29c70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  gnoNew[i];.     
29c80 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
29c90 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d        pgnoNew[i]
29ca0 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d   = pgnoNew[minI]
29cb0 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
29cc0 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
29cd0 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69        pgnoNew[mi
29ce0 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61  nI] = t;.      a
29cf0 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
29d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
29d10 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
29d20 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77  d: %d %d %d  new
29d30 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
29d40 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
29d50 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e  (%d)\n",.    pgn
29d60 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f  oOld[0], .    nO
29d70 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=2 ? pgnoOld[
29d80 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  1] : 0,.    nOld
29d90 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d  >=3 ? pgnoOld[2]
29da0 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65   : 0,.    pgnoNe
29db0 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  w[0], szNew[0],.
29dc0 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67      nNew>=2 ? pg
29dd0 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e  noNew[1] : 0, nN
29de0 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d  ew>=2 ? szNew[1]
29df0 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
29e00 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a  3 ? pgnoNew[2] :
29e10 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a   0, nNew>=3 ? sz
29e20 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  New[2] : 0,.    
29e30 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65  nNew>=4 ? pgnoNe
29e40 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[3] : 0, nNew>=
29e50 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
29e60 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
29e70 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20  pgnoNew[4] : 0, 
29e80 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
29e90 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a  4] : 0));..  /*.
29ea0 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
29eb0 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
29ec0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
29ed0 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
29ee0 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
29ef0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
29f00 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
29f10 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
29f20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
29f30 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
29f40 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
29f50 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
29f60 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
29f70 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
29f80 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
29f90 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
29fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
29fb0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b  ->pgno==pgnoNew[
29fc0 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  i] );.    zeroPa
29fd0 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
29fe0 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  gs);.    assembl
29ff0 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
2a000 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
2a010 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
2a020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
2a030 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
2a040 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
2a050 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
2a060 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
2a070 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20  verflow==0 );.. 
2a080 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2a090 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
2a0a0 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
2a0b0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2a0c0 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
2a0d0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  that point to th
2a0e0 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20  e siblings that 
2a0f0 77 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e  were rearranged.
2a100 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c   These can be: l
2a110 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  eft.    ** child
2a120 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68  ren of cells, th
2a130 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
2a140 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76   the page, or ov
2a150 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20  erflow pages.   
2a160 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
2a170 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a  y cells..    */.
2a180 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2a190 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f  CUUM ){.      fo
2a1a0 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b  r(k=j; k<cntNew[
2a1b0 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; k++){.      
2a1c0 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78    assert( k<nMax
2a1d0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
2a1e0 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30   if( aFrom[k]==0
2a1f0 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46  xFF || apCopy[aF
2a200 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70  rom[k]]->pgno!=p
2a210 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
2a220 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2a230 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
2a240 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-j);.          
2a250 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a260 4b 20 26 26 20 6c 65 61 66 43 6f 72 72 65 63 74  K && leafCorrect
2a270 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
2a280 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2a290 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
2a2a0 74 65 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50  te(apCell[k]), P
2a2b0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
2a2c0 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  w->pgno);.      
2a2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a2e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a2f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2a300 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2a310 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
2a320 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2a330 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2a340 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
2a350 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
2a360 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
2a370 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
2a380 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
2a390 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
2a3a0 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
2a3b0 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
2a3c0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
2a3d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e    */.    if( i<n
2a3e0 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c  New-1 && j<nCell
2a3f0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
2a400 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
2a410 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
2a420 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
2a430 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
2a440 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
2a450 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
2a460 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
2a470 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
2a480 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
2a490 26 61 53 70 61 63 65 32 5b 69 53 70 61 63 65 32  &aSpace2[iSpace2
2a4a0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
2a4b0 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
2a4c0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2a4d0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
2a4e0 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69  l, 4);.        i
2a4f0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2a500 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 61 46  .         && (aF
2a510 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20  rom[j]==0xFF || 
2a520 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d  apCopy[aFrom[j]]
2a530 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
2a540 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  no).        ){. 
2a550 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
2a560 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
2a570 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 50 54  4byte(pCell), PT
2a580 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
2a590 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
2a5a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a5b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a5c0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2a5d0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2a5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2a5f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a600 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
2a610 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
2a620 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
2a630 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
2a640 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
2a650 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
2a660 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
2a670 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
2a680 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
2a690 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
2a6a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
2a6b0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
2a6c0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
2a6d0 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
2a6e0 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
2a6f0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
2a700 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
2a710 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
2a720 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
2a730 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2a740 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
2a750 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
2a760 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
2a770 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
2a780 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
2a790 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
2a7a0 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70      fillInCell(p
2a7b0 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30  Parent, pCell, 0
2a7c0 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
2a7d0 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20  0, 0, &sz);.    
2a7e0 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20      pTemp = 0;. 
2a7f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a800 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a      pCell -= 4;.
2a810 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75          /* Obscu
2a820 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d  re case for non-
2a830 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a  leaf-data trees:
2a840 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20   If the cell at 
2a850 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20  pCell was.      
2a860 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
2a870 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66  stored on a leaf
2a880 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72   node, and its r
2a890 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73  eported size was
2a8a0 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79   4.        ** by
2a8b0 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  tes, then it may
2a8c0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61   actually be sma
2a8d0 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a  ller than this .
2a8e0 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20          ** (see 
2a8f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
2a900 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
2a910 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
2a920 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
2a930 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
2a940 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
2a950 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
2a960 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
2a970 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
2a980 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
2a990 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
2a9a0 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
2a9b0 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
2a9c0 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
2a9d0 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
2a9e0 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
2a9f0 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
2aa00 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
2aa10 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
2aa20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
2aa30 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
2aa40 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
2aa50 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
2aa60 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
2aa70 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
2aa80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2aa90 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
2aaa0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
2aab0 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
2aac0 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
2aad0 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
2aae0 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
2aaf0 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
2ab00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53        }.      iS
2ab10 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20  pace2 += sz;.   
2ab20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
2ab30 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
2ab40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ab50 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61  iSpace2<=pBt->pa
2ab60 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
2ab70 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2ab80 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
2ab90 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
2aba0 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 4);.      if( 
2abb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2abc0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2abd0 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75 74 34  anup;.      put4
2abe0 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
2abf0 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78  wCell(pParent,nx
2ac00 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Div), pNew->pgno
2ac10 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2ac20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2ac30 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2ac40 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
2ac50 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
2ac60 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
2ac70 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
2ac80 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
2ac90 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
2aca0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
2acb0 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
2acc0 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
2acd0 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
2ace0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2acf0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20  ISAUTOVACUUM && 
2ad00 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20  !leafData ){.   
2ad10 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2ad20 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c  PutOvfl(pParent,
2ad30 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20   nxDiv);.       
2ad40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ad50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ad60 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2ad70 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
2ad80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b        }.      j+
2ad90 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
2ada0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2adb0 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
2adc0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68  map entry for th
2add0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
2ade0 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ge. */.    if( I
2adf0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2ae00 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2ae10 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70  Put(pBt, pNew->p
2ae20 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
2ae30 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
2ae40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2ae50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ae60 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2ae70 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2ae80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ae90 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
2aea0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
2aeb0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
2aec0 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
2aed0 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
2aee0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
2aef0 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
2af00 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
2af10 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
2af20 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
2af30 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
2af40 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20  zChild, 4);.    
2af50 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2af60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2af70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
2af80 74 34 62 79 74 65 28 7a 43 68 69 6c 64 29 2c 20  t4byte(zChild), 
2af90 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
2afa0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
2afb0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2afc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2afd0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2afe0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2aff0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2b000 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72   if( nxDiv==pPar
2b010 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65  ent->nCell+pPare
2b020 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
2b030 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
2b040 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
2b050 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  e right-most chi
2b060 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f  ld of pParent */
2b070 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2b080 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2b090 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2b0a0 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  +8], pgnoNew[nNe
2b0b0 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w-1]);.  }else{.
2b0c0 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
2b0d0 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
2b0e0 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74   left child of t
2b0f0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2b100 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a  n pParent.    **
2b110 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d   past the right-
2b120 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74  most divider ent
2b130 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  ry */.    put4by
2b140 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
2b150 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
2b160 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  iv), pgnoNew[nNe
2b170 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w-1]);.  }..  /*
2b180 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63  .  ** Reparent c
2b190 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63  hildren of all c
2b1a0 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ells..  */.  for
2b1b0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2b1c0 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70  +){.    rc = rep
2b1d0 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
2b1e0 61 70 4e 65 77 5b 69 5d 2c 20 30 29 3b 0a 20 20  apNew[i], 0);.  
2b1f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b200 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
2b210 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2b220 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
2b230 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e  hildPages(pParen
2b240 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
2b250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2b260 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2b270 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61  p;..  /*.  ** Ba
2b280 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
2b290 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61   page.  Note tha
2b2a0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
2b2b0 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74  ge (pPage) might
2b2c0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2b2d0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
2b2e0 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68  elist so it migh
2b2f0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69  t no longer be i
2b300 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
2b310 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20   But the parent 
2b320 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  page will always
2b330 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
2b340 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2b350 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 3d  pParent->isInit=
2b360 3d 50 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c  =PAGE_ISINIT_FUL
2b370 4c 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  L );.  sqlite3Sc
2b380 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
2b390 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b  );.  apCell = 0;
2b3a0 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
2b3b0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a  pParent, 0);.  .
2b3c0 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
2b3d0 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
2b3e0 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
2b3f0 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
2b400 74 65 33 50 61 67 65 46 72 65 65 28 61 53 70 61  te3PageFree(aSpa
2b410 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ce2);.  sqlite3S
2b420 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c  cratchFree(apCel
2b430 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l);.  for(i=0; i
2b440 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
2b450 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
2b460 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  ld[i]);.  }.  fo
2b470 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
2b480 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
2b490 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  Page(apNew[i]);.
2b4a0 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 50 61    }..  releasePa
2b4b0 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54  ge(pParent);.  T
2b4c0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2b4d0 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25 64  finished with %d
2b4e0 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
2b4f0 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
2b500 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67         pPage->pg
2b510 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20  no, nOld, nNew, 
2b520 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 72 65 74 75  nCell));..  retu
2b530 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b540 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2b550 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72  called for the r
2b560 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74  oot page of a bt
2b570 72 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  ree when the roo
2b580 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  t.** page contai
2b590 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68  ns no cells.  Th
2b5a0 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75  is is an opportu
2b5b0 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65  nity to make the
2b5c0 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77   tree.** shallow
2b5d0 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e  er by one level.
2b5e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2b5f0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2b600 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
2b610 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  {.  MemPage *pCh
2b620 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
2b630 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69   /* The only chi
2b640 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65  ld page of pPage
2b650 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
2b660 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2b670 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2b680 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a  r for pChild */.
2b690 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b6a0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
2b6b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
2b6c0 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
2b6d0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
2b6e0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
2b6f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2b700 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72  n BTree structur
2b710 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c  e */.  int mxCel
2b720 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20  lPerPage;       
2b730 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
2b740 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70  umber of cells p
2b750 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  er page */.  u8 
2b760 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
2b770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2b780 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65   cells from page
2b790 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
2b7a0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
2b7b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2b7c0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
2b7d0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
2b7e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2b7f0 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b  e->pParent==0 );
2b800 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b810 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2b820 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2b830 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2b840 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2b850 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
2b860 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72  pBt;.  mxCellPer
2b870 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70  Page = MX_CELL(p
2b880 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20  Bt);.  apCell = 
2b890 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d  sqlite3Malloc( m
2b8a0 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69  xCellPerPage*(si
2b8b0 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66  zeof(u8*)+sizeof
2b8c0 28 75 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20  (u16)) );.  if( 
2b8d0 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  apCell==0 ) retu
2b8e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2b8f0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
2b900 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c  *)&apCell[mxCell
2b910 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  PerPage];.  if( 
2b920 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b930 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2b940 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  is completely em
2b950 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45  pty */.    TRACE
2b960 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74  (("BALANCE: empt
2b970 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70  y table %d\n", p
2b980 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2b990 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2b9a0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2b9b0 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65  mpty but has one
2b9c0 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65   child.  Transfe
2b9d0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66  r the.    ** inf
2b9e0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2b9f0 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74  at one child int
2ba00 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2ba10 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  if it .    ** wi
2ba20 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65  ll fit.  This re
2ba30 64 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20  duces the depth 
2ba40 6f 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f  of the tree by o
2ba50 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
2ba60 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * If the root pa
2ba70 67 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74  ge is page 1, it
2ba80 20 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20   has less space 
2ba90 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20  available than. 
2baa0 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20     ** its child 
2bab0 28 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20  (due to the 100 
2bac0 62 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74  byte header that
2bad0 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62   occurs at the b
2bae0 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eginning.    ** 
2baf0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2bb00 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68  fle), so it migh
2bb10 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  t not be able to
2bb20 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65   hold all of the
2bb30 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61   .    ** informa
2bb40 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63  tion currently c
2bb50 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
2bb60 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20  child.  If this 
2bb70 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  is the .    ** c
2bb80 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ase, then do not
2bb90 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72   do the transfer
2bba0 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20  .  Leave page 1 
2bbb0 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20  empty except.   
2bbc0 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68   ** for the righ
2bbd0 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  t-pointer to the
2bbe0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
2bbf0 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63  e child page bec
2bc00 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  omes.    ** the 
2bc10 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
2bc20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f  the tree..    */
2bc30 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d  .    pgnoChild =
2bc40 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2bc50 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2bc60 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2bc70 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68    assert( pgnoCh
2bc80 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ild>0 );.    ass
2bc90 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d  ert( pgnoChild<=
2bca0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2bcb0 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
2bcc0 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r) );.    rc = s
2bcd0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2bce0 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ge(pPage->pBt, p
2bcf0 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c  gnoChild, &pChil
2bd00 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  d, 0);.    if( r
2bd10 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
2bd20 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
2bd30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e    if( pPage->pgn
2bd40 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63  o==1 ){.      rc
2bd50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2bd60 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
2bd70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
2bd80 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2bd90 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2bda0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2bdb0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2bdc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2bdd0 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d   pChild->nFree>=
2bde0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  100 ){.        /
2bdf0 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f  * The child info
2be00 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74  rmation will fit
2be10 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
2be20 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20  e, so do the.   
2be30 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a       ** copy */.
2be40 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
2be50 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28         zeroPage(
2be60 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
2be70 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
2be80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
2be90 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
2bea0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65  {.          apCe
2beb0 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  ll[i] = findCell
2bec0 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20  (pChild,i);.    
2bed0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20        szCell[i] 
2bee0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43  = cellSizePtr(pC
2bef0 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29  hild, apCell[i])
2bf00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bf10 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2bf20 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2bf30 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73  nCell, apCell, s
2bf40 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zCell);.        
2bf50 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68  /* Copy the righ
2bf60 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t-pointer of the
2bf70 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61   child to the pa
2bf80 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rent. */.       
2bf90 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2bfa0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2bfb0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
2bfc0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
2bfd0 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
2bfe0 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
2bff0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2c000 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2c010 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  d);.        TRAC
2c020 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
2c030 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74  ld %d transfer t
2c040 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  o page 1\n", pCh
2c050 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2c060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c070 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68    /* The child h
2c080 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  as more informat
2c090 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ion that will fi
2c0a0 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20  t on the root.. 
2c0b0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72         ** The tr
2c0c0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61  ee is already ba
2c0d0 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68  lanced.  Do noth
2c0e0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
2c0f0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2c100 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e   child %d will n
2c110 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31  ot fit on page 1
2c120 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
2c130 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
2c140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2c150 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74  mcpy(pPage->aDat
2c160 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  a, pChild->aData
2c170 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
2c180 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
2c190 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2c1a0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
2c1b0 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
2c1c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c1d0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
2c1e0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  age, 0);.      a
2c1f0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2c200 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72  E_OK );.      fr
2c210 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
2c220 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
2c230 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20  LANCE: transfer 
2c240 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f  child %d into ro
2c250 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot %d\n",.      
2c260 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e          pChild->
2c270 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e  pgno, pPage->pgn
2c280 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
2c290 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
2c2a0 64 50 61 67 65 73 28 70 50 61 67 65 2c 20 31 29  dPages(pPage, 1)
2c2b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2c2c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
2c2d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41  0 );.    if( ISA
2c2e0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2c2f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2c300 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
2c310 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a  ->nCell; i++){ .
2c320 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2c330 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65  mapPutOvfl(pPage
2c340 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
2c350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2c370 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
2c380 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d  lance;.        }
2c390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c3a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2c3b0 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f  Child);.  }.end_
2c3c0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a  shallow_balance:
2c3d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2c3e0 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72  apCell);.  retur
2c3f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2c400 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
2c410 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20   overfull.**.** 
2c420 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e  When this happen
2c430 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  s, Create a new 
2c440 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63  child page and c
2c450 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  opy the.** conte
2c460 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  nts of the root 
2c470 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20  into the child. 
2c480 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72   Then make the r
2c490 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65  oot.** page an e
2c4a0 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72  mpty page with r
2c4b0 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69  ightChild pointi
2c4c0 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  ng to the new.**
2c4d0 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c   child.   Finall
2c4e0 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  y, call balance_
2c4f0 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68  internal() on th
2c500 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74  e new child.** t
2c510 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70  o cause it to sp
2c520 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lit..*/.static i
2c530 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
2c540 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
2c550 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
2c560 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2c570 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
2c580 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
2c590 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
2c5a0 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
2c5b0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
2c5c0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
2c5d0 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20  noChild;     /* 
2c5e0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
2c5f0 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
2c600 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
2c610 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pBt;         /*
2c620 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20   The BTree */.  
2c630 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
2c640 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61      /* Total usa
2c650 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  ble size of a pa
2c660 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ge */.  u8 *data
2c670 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2c680 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2c690 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75  rent page */.  u
2c6a0 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20  8 *cdata;       
2c6b0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2c6c0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
2c6d0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
2c6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2c6f0 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65  et to page heade
2c700 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20  r in parent */. 
2c710 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
2c720 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2c730 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72  o content of fir
2c740 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e  st cell in paren
2c750 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
2c760 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
2c770 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2c780 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2c790 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  0 );.  pBt = pPa
2c7a0 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ge->pBt;.  asser
2c7b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2c7c0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2c7d0 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  ) );.  rc = allo
2c7e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2c7f0 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e  t, &pChild, &pgn
2c800 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70  oChild, pPage->p
2c810 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  gno, 0);.  if( r
2c820 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2c830 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c840 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c850 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65  (pChild->pDbPage
2c860 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
2c870 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
2c880 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ize;.  data = pP
2c890 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
2c8a0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2c8b0 66 73 65 74 3b 0a 20 20 63 62 72 6b 20 3d 20 67  fset;.  cbrk = g
2c8c0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2c8d0 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d  r+5]);.  cdata =
2c8e0 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a   pChild->aData;.
2c8f0 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20    memcpy(cdata, 
2c900 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67  &data[hdr], pPag
2c910 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
2c920 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72  pPage->nCell-hdr
2c930 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61  );.  memcpy(&cda
2c940 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  ta[cbrk], &data[
2c950 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
2c960 65 2d 63 62 72 6b 29 3b 0a 20 20 69 66 28 20 70  e-cbrk);.  if( p
2c970 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 50  Child->isInit==P
2c980 41 47 45 5f 49 53 49 4e 49 54 5f 46 55 4c 4c 20  AGE_ISINIT_FULL 
2c990 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c9a0 43 4f 52 52 55 50 54 3b 0a 20 20 72 63 20 3d 20  CORRUPT;.  rc = 
2c9b0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2c9c0 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61  Page(pChild, pPa
2c9d0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
2c9e0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70  goto balancedeep
2c9f0 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79  er_out;.  memcpy
2ca00 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20  (pChild->aOvfl, 
2ca10 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50  pPage->aOvfl, pP
2ca20 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73  age->nOverflow*s
2ca30 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
2ca40 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c  fl[0]));.  pChil
2ca50 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  d->nOverflow = p
2ca60 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  Page->nOverflow;
2ca70 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e  .  if( pChild->n
2ca80 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2ca90 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20  pChild->nFree = 
2caa0 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
2cab0 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d   pChild->nCell==
2cac0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2cad0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2cae0 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
2caf0 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b  0] & ~PTF_LEAF);
2cb00 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
2cb10 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2cb20 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2cb30 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52 41  gnoChild);.  TRA
2cb40 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f  CE(("BALANCE: co
2cb50 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20  py root %d into 
2cb60 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
2cb70 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  no, pChild->pgno
2cb80 29 29 3b 0a 20 20 69 66 28 20 49 53 41 55 54 4f  ));.  if( ISAUTO
2cb90 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 69 6e  VACUUM ){.    in
2cba0 74 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74  t i;.    rc = pt
2cbb0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68  rmapPut(pBt, pCh
2cbc0 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  ild->pgno, PTRMA
2cbd0 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e  P_BTREE, pPage->
2cbe0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
2cbf0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
2cc00 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20  deeper_out;.    
2cc10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c  for(i=0; i<pChil
2cc20 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  d->nCell; i++){.
2cc30 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2cc40 70 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c  pPutOvfl(pChild,
2cc50 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   i);.      if( r
2cc60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cc70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2cc80 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
2cc90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2cca0 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
2ccb0 68 69 6c 64 50 61 67 65 73 28 70 43 68 69 6c 64  hildPages(pChild
2ccc0 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
2ccd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cce0 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
2ccf0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64  e_nonroot(pChild
2cd00 29 3b 0a 20 20 7d 0a 0a 62 61 6c 61 6e 63 65 64  );.  }..balanced
2cd10 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c  eeper_out:.  rel
2cd20 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
2cd30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2cd40 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69  ../*.** Decide i
2cd50 66 20 74 68 65 20 70 61 67 65 20 70 50 61 67 65  f the page pPage
2cd60 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c   needs to be bal
2cd70 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c 61 6e  anced.  If balan
2cd80 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75 69  cing is.** requi
2cd90 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20 61 70  red, call the ap
2cda0 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63  propriate balanc
2cdb0 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  ing routine..*/.
2cdc0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2cdd0 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
2cde0 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a  e, int insert){.
2cdf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ce00 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
2ce10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2ce20 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2ce30 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
2ce40 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Page->pParent==0
2ce50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2ce60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2ce70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2ce80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ce90 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
2cea0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20  nOverflow>0 ){. 
2ceb0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2cec0 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 29 3b  e_deeper(pPage);
2ced0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2cee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2cef0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2cf00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2cf10 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
2cf20 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
2cf30 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
2cf40 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2cf50 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21  0 || .        (!
2cf60 69 6e 73 65 72 74 20 26 26 20 70 50 61 67 65 2d  insert && pPage-
2cf70 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42  >nFree>pPage->pB
2cf80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2cf90 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  3) ){.      rc =
2cfa0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2cfb0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
2cfc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2cfd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2cfe0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c  utine checks all
2cff0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f   cursors that po
2d000 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e  int to table pgn
2d010 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79  oRoot..** If any
2d020 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72   of those cursor
2d030 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69  s were opened wi
2d040 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20  th wrFlag==0 in 
2d050 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64  a different.** d
2d060 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2d070 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20 63  on (a database c
2d080 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73  onnection that s
2d090 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72 0a  hares the pager.
2d0a0 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74 68  ** cache with th
2d0b0 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63  e current connec
2d0c0 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f  tion) and that o
2d0d0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2d0e0 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  .** is not in th
2d0f0 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74  e ReadUncommmitt
2d100 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ed state, then t
2d110 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2d120 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  rns .** SQLITE_L
2d130 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20  OCKED..**.** As 
2d140 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20  well as cursors 
2d150 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20  with wrFlag==0, 
2d160 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46  cursors with wrF
2d170 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69  lag==1 and .** i
2d180 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d  sIncrblobHandle=
2d190 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73  =1 are also cons
2d1a0 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63 75  idered 'read' cu
2d1b0 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74  rsors. Increment
2d1c0 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73  al .** blob curs
2d1d0 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ors are used for
2d1e0 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e   both reading an
2d1f0 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  d writing..**.**
2d200 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69   When pgnoRoot i
2d210 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
2d220 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62  of an intkey tab
2d230 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
2d240 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73  n is also.** res
2d250 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76  ponsible for inv
2d260 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65 6d  alidating increm
2d270 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2d280 72 73 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c  rs when the tabl
2d290 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63  e row.** on whic
2d2a0 68 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e 65  h they are opene
2d2b0 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20  d is deleted or 
2d2c0 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f 72  modified. Cursor
2d2d0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
2d2e0 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74  d.** according t
2d2f0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2d300 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  rules:.**.**   1
2d310 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65 61  ) When BtreeClea
2d320 72 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c 6c  rTable() is call
2d330 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ed to completely
2d340 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74   delete the cont
2d350 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20  ents.**      of 
2d360 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c 20  a B-Tree table, 
2d370 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20  pExclude is set 
2d380 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72 61  to zero and para
2d390 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a 2a  meter iRow is .*
2d3a0 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e 6f  *      set to no
2d3b0 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  n-zero. In this 
2d3c0 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65  case all increme
2d3d0 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2d3e0 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f  s open.**      o
2d3f0 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  n the table root
2d400 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61  ed at pgnoRoot a
2d410 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  re invalidated..
2d420 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
2d430 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20 42  BtreeInsert(), B
2d440 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
2d450 42 74 72 65 65 50 75 74 44 61 74 61 28 29 20 69  BtreePutData() i
2d460 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20  s called to .** 
2d470 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74 61       modify a ta
2d480 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20 53  ble row via an S
2d490 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70 45  QL statement, pE
2d4a0 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f  xclude is set to
2d4b0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77 72   the .**      wr
2d4c0 69 74 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ite cursor used 
2d4d0 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66 69  to do the modifi
2d4e0 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d  cation and param
2d4f0 65 74 65 72 20 69 52 6f 77 20 69 73 20 73 65 74  eter iRow is set
2d500 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
2d510 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20 6f  integer row id o
2d520 66 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e 74  f the B-Tree ent
2d530 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ry being modifie
2d540 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20  d. Unless.**    
2d550 20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69 74    pExclude is it
2d560 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  self an incremen
2d570 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c  tal blob cursor,
2d580 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d   then all increm
2d590 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c  ental.**      bl
2d5a0 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
2d5b0 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20 74  on row iRow of t
2d5c0 68 65 20 42 2d 54 72 65 65 20 61 72 65 20 69 6e  he B-Tree are in
2d5d0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  validated..**.**
2d5e0 20 20 20 33 29 20 49 66 20 62 6f 74 68 20 70 45     3) If both pE
2d5f0 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77 20  xclude and iRow 
2d600 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c  are set to zero,
2d610 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   no incremental 
2d620 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63 75  blob .**      cu
2d630 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
2d640 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
2d650 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
2d660 63 6b 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  cks(.  Btree *pB
2d670 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67  tree, .  Pgno pg
2d680 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72  noRoot, .  BtCur
2d690 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20  sor *pExclude,. 
2d6a0 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42   i64 iRow.){.  B
2d6b0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74  tCursor *p;.  Bt
2d6c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42  Shared *pBt = pB
2d6d0 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c  tree->pBt;.  sql
2d6e0 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65  ite3 *db = pBtre
2d6f0 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
2d700 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2d710 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
2d720 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
2d730 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2d740 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2d750 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
2d760 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2d770 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67   p->pgnoRoot!=pg
2d780 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75  noRoot ) continu
2d790 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2d7a0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
2d7b0 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63      if( p->isInc
2d7c0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28  rblobHandle && (
2d7d0 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45 78   .         (!pEx
2d7e0 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a 20  clude && iRow). 
2d7f0 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75 64       || (pExclud
2d800 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d 3e  e && !pExclude->
2d810 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2d820 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   && p->info.nKey
2d830 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a  ==iRow).    )){.
2d840 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
2d850 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2d860 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2d870 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
2d880 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2d890 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2d8a0 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
2d8b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d8c0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
2d8d0 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62     || p->isIncrb
2d8e0 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66  lobHandle.#endif
2d8f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
2d900 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d  lite3 *dbOther =
2d910 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a   p->pBtree->db;.
2d920 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65        if( dbOthe
2d930 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  r==0 ||.        
2d940 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26   (dbOther!=db &&
2d950 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73   (dbOther->flags
2d960 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
2d970 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29  committed)==0) )
2d980 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2d990 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2d9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d9b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2d9c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
2d9d0 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
2d9e0 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
2d9f0 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
2da00 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
2da10 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
2da20 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
2da30 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
2da40 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
2da50 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
2da60 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
2da70 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
2da80 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
2da90 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
2daa0 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
2dab0 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
2dac0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
2dad0 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
2dae0 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
2daf0 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
2db00 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
2db10 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
2db20 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
2db30 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
2db40 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
2db50 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
2db60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2db70 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
2db80 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2db90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2dba0 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
2dbb0 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
2dbc0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2dbd0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2dbe0 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2dbf0 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
2dc00 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
2dc10 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2dc20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
2dc30 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
2dc40 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2dc50 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
2dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dc70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
2dc80 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
2dc90 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
2dca0 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20   int appendBias 
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcc0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2dcd0 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
2dce0 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
2dcf0 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
2dd00 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65   int szNew;.  Me
2dd10 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2dd20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
2dd30 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
2dd40 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2dd50 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
2dd60 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75  ar *oldCell;.  u
2dd70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65  nsigned char *ne
2dd80 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  wCell = 0;..  as
2dd90 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2dda0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2ddb0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2ddc0 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2ddd0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2dde0 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2ddf0 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
2de00 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20  doing an insert 
2de10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2de20 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2de30 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2de40 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2de50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2de60 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2de70 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
2de80 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2de90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2dea0 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43  ITE_PERM;   /* C
2deb0 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66  ursor not open f
2dec0 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
2ded0 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
2dee0 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
2def0 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
2df00 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29  oot, pCur, nKey)
2df10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2df20 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2df30 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2df40 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2df50 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2df60 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2df70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2df80 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2df90 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2dfa0 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
2dfb0 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2dfc0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
2dfd0 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
2dfe0 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73 6f   */.  clearCurso
2dff0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2e000 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49  .  if( .    SQLI
2e010 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
2e020 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
2e030 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2e040 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53   pCur)) ||.    S
2e050 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2e060 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2e070 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e  to(pCur, pKey, n
2e080 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c  Key, appendBias,
2e090 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20   &loc)).  ){.   
2e0a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2e0b0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2e0c0 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
2e0d0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2e0e0 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  || nKey>=0 );.  
2e0f0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
2e100 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69  eaf || !pPage->i
2e110 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52 41 43 45  ntKey );.  TRACE
2e120 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
2e130 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
2e140 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
2e150 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
2e160 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2e170 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
2e180 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
2e190 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
2e1a0 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
2e1b0 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
2e1c0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2e1d0 74 3d 3d 50 41 47 45 5f 49 53 49 4e 49 54 5f 46  t==PAGE_ISINIT_F
2e1e0 55 4c 4c 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74  ULL );.  allocat
2e1f0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
2e200 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74  .  newCell = pBt
2e210 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69  ->pTmpSpace;.  i
2e220 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20  f( newCell==0 ) 
2e230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2e240 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  MEM;.  rc = fill
2e250 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65  InCell(pPage, ne
2e260 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65  wCell, pKey, nKe
2e270 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c  y, pData, nData,
2e280 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b   nZero, &szNew);
2e290 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2e2a0 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61   end_insert;.  a
2e2b0 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65  ssert( szNew==ce
2e2c0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2e2d0 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61   newCell) );.  a
2e2e0 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58  ssert( szNew<=MX
2e2f0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
2e300 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20  );.  if( loc==0 
2e310 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  && CURSOR_VALID=
2e320 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2e330 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a  .    u16 szOld;.
2e340 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2e350 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
2e360 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
2e370 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
2e380 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e390 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e3a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2e3b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
2e3c0 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
2e3d0 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
2e3e0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2e3f0 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21  >idx);.    if( !
2e400 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e410 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43       memcpy(newC
2e420 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29  ell, oldCell, 4)
2e430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c  ;.    }.    szOl
2e440 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  d = cellSizePtr(
2e450 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
2e460 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
2e470 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  ell(pPage, oldCe
2e480 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
2e490 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2e4a0 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  t;.    dropCell(
2e4b0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2e4c0 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73  , szOld);.  }els
2e4d0 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
2e4e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
2e4f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e500 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
2e510 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20  pCur->idx++;.   
2e520 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e530 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
2e540 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
2e550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2e560 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2e570 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69   );.  }.  rc = i
2e580 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
2e590 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43   pCur->idx, newC
2e5a0 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30  ell, szNew, 0, 0
2e5b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2e5c0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
2e5d0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d  d_insert;.  rc =
2e5e0 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2e5f0 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
2e600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
2e610 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2e620 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a  .  }.end_insert:
2e630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e640 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2e650 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
2e660 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
2e670 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
2e680 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
2e690 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
2e6a0 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  dom location..*/
2e6b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e6c0 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
2e6d0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2e6e0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2e6f0 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67  ->pPage;.  unsig
2e700 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2e710 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
2e720 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
2e730 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
2e740 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
2e750 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2e760 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
2e770 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2e780 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2e790 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2e7a0 69 74 3d 3d 50 41 47 45 5f 49 53 49 4e 49 54 5f  it==PAGE_ISINIT_
2e7b0 46 55 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 42  FULL );.  if( pB
2e7c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2e7d0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2e7e0 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2e7f0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2e800 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20   before doing a 
2e810 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63  delete */.    rc
2e820 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2e830 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2e840 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2e850 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2e860 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2e870 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2e880 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2e890 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2e8a0 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2e8b0 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2e8c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
2e8d0 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   >= pPage->nCell
2e8e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2e8f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a  QLITE_ERROR;  /*
2e900 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
2e910 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
2e920 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2e930 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2e940 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2e950 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2e960 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20  /* Did not open 
2e970 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20  this cursor for 
2e980 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2e990 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2e9a0 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2e9b0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2e9c0 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e  , pCur, pCur->in
2e9d0 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20  fo.nKey) ){.    
2e9e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2e9f0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2ea00 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2ea10 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2ea20 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  k */.  }..  /* R
2ea30 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
2ea40 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2ea50 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74  on (a no-op if t
2ea60 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2ea70 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52   in .  ** CURSOR
2ea80 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
2ea90 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65  te) and save the
2eaa0 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
2eab0 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2eac0 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68  .  ** open on th
2ead0 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68  e same table. Th
2eae0 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  en call sqlite3P
2eaf0 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
2eb00 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61  he page.  ** tha
2eb10 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c  t the entry will
2eb20 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
2eb30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
2eb40 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43    (rc = restoreC
2eb50 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2eb60 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
2eb70 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2eb80 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
2eb90 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21  gnoRoot, pCur))!
2eba0 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20  =0 ||.    (rc = 
2ebb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ebc0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2ebd0 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  ))!=0.  ){.    r
2ebe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2ebf0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
2ec00 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70  ell within its p
2ec10 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
2ec20 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
2ec30 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
2ec40 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
2ec50 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
2ec60 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2ec70 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2ec80 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
2ec90 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
2eca0 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
2ecb0 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  /.  pCell = find
2ecc0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2ecd0 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  ->idx);.  if( !p
2ece0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2ecf0 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2ed00 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
2ed10 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
2ed20 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2ed30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2ed40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ed50 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
2ed60 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a  >leaf ){.    /*.
2ed70 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79      ** The entry
2ed80 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2ed90 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61   delete is not a
2eda0 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64   leaf so if we d
2edb0 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20  o not.    ** do 
2edc0 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c  something we wil
2edd0 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f  l leave a hole o
2ede0 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61  n an internal pa
2edf0 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61  ge..    ** We ha
2ee00 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68  ve to fill the h
2ee10 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e  ole by moving in
2ee20 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c   a cell from a l
2ee30 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  eaf.  The.    **
2ee40 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72   next Cell after
2ee50 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64   the one to be d
2ee60 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e  eleted is guaran
2ee70 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e  teed to exist an
2ee80 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61  d.    ** to be a
2ee90 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20   leaf so we can 
2eea0 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
2eeb0 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66     BtCursor leaf
2eec0 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  Cur;.    unsigne
2eed0 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20  d char *pNext;. 
2eee0 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
2eef0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2ef00 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b  r *tempCell = 0;
2ef10 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2ef20 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
2ef30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47     sqlite3BtreeG
2ef40 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75  etTempCursor(pCu
2ef50 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  r, &leafCur);.  
2ef60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2ef70 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
2ef80 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
2ef90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2efa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2efb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2efc0 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  te(leafCur.pPage
2efd0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2efe0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2eff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f000 20 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20   u16 szNext;.   
2f010 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
2f020 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
2f030 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d  te internal from
2f040 20 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d   %d replace from
2f050 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2f060 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2f070 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2f080 6f 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65  o, leafCur.pPage
2f090 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2f0a0 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
2f0b0 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53  pCur->idx, cellS
2f0c0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2f0d0 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65  ell));.      pNe
2f0e0 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65  xt = findCell(le
2f0f0 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61  afCur.pPage, lea
2f100 66 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20  fCur.idx);.     
2f110 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69   szNext = cellSi
2f120 7a 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50  zePtr(leafCur.pP
2f130 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20  age, pNext);.   
2f140 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
2f150 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a  LL_SIZE(pBt)>=sz
2f160 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20  Next+4 );.      
2f170 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
2f180 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65  e(pBt);.      te
2f190 6d 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  mpCell = pBt->pT
2f1a0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69  mpSpace;.      i
2f1b0 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29  f( tempCell==0 )
2f1c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2f1d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2f1e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2f1f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f200 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73          rc = ins
2f210 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
2f220 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d  Cur->idx, pNext-
2f230 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d  4, szNext+4, tem
2f240 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  pCell, 0);.     
2f250 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
2f260 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f270 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
2f280 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2f290 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2f2a0 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20  ), pgnoChild);. 
2f2b0 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
2f2c0 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  nce(pPage, 0);. 
2f2d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f2e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f2f0 7b 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  {.        dropCe
2f300 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2f310 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73  , leafCur.idx, s
2f320 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zNext);.        
2f330 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61  rc = balance(lea
2f340 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a  fCur.pPage, 0);.
2f350 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f360 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65    sqlite3BtreeRe
2f370 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
2f380 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c  &leafCur);.  }el
2f390 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22  se{.    TRACE(("
2f3a0 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2f3b0 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61   delete from lea
2f3c0 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2f3d0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2f3e0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2f3f0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2f400 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65  e, pCur->idx, ce
2f410 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2f420 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63   pCell));.    rc
2f430 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2f440 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
2f450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f460 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
2f470 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pCur);.  }.  ret
2f480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f490 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54   Create a new BT
2f4a0 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74  ree table.  Writ
2f4b0 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20  e into *piTable 
2f4c0 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
2f4d0 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  er for the root 
2f4e0 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
2f4f0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
2f500 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73   type of type is
2f510 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
2f520 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2f530 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a  er.  Only the.**
2f540 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
2f550 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63  s of flags are c
2f560 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e  urrently in use.
2f570 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66    Other values f
2f580 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68  or.** flags migh
2f590 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a  t not work:.**.*
2f5a0 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b  *     BTREE_INTK
2f5b0 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54  EY|BTREE_LEAFDAT
2f5c0 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53  A     Used for S
2f5d0 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72  QL tables with r
2f5e0 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20  owid keys.**    
2f5f0 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20   BTREE_ZERODATA 
2f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f610 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e   Used for SQL in
2f620 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  dices.*/.static 
2f630 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54  int btreeCreateT
2f640 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2f650 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74  nt *piTable, int
2f660 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61   flags){.  BtSha
2f670 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2f680 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  t;.  MemPage *pR
2f690 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  oot;.  Pgno pgno
2f6a0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Root;.  int rc;.
2f6b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2f6c0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2f6d0 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70 42  x(p) );.  if( pB
2f6e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2f6f0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2f700 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2f710 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2f720 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 63   first */.    rc
2f730 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2f740 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2f750 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2f760 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2f770 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2f780 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2f790 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
2f7a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2f7b0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2f7c0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2f7d0 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
2f7e0 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 1, 0);.  if( r
2f7f0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2f800 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  rc;.  }.#else.  
2f810 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2f820 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
2f830 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f  pgnoMove;      /
2f840 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65  * Move a page he
2f850 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  re to make room 
2f860 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2f870 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  e */.    MemPage
2f880 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20   *pPageMove; /* 
2f890 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  The page to move
2f8a0 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   to. */..    /* 
2f8b0 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74  Creating a new t
2f8c0 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c  able may probabl
2f8d0 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
2f8e0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   an existing dat
2f8f0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20  abase.    ** to 
2f900 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
2f910 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f  e new tables roo
2f920 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20  t page. In case 
2f930 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a  this page turns.
2f940 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65      ** out to be
2f950 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2f960 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76  e, delete all ov
2f970 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20  erflow page-map 
2f980 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65  caches.    ** he
2f990 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f  ld by open curso
2f9a0 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rs..    */.    i
2f9b0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
2f9c0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
2f9d0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
2f9e0 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33   value of meta[3
2f9f0 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ] from the datab
2fa00 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ase to determine
2fa10 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a   where the.    *
2fa20 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
2fa30 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f  he new table sho
2fa40 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20  uld go. meta[3] 
2fa50 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
2fa60 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
2fa70 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20  created so far, 
2fa80 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  so the new root-
2fa90 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d  page is (meta[3]
2faa0 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +1)..    */.    
2fab0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2fac0 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
2fad0 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2fae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2faf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2fb00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2fb10 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20  gnoRoot++;..    
2fb20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d  /* The new root-
2fb30 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
2fb40 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70  allocated on a p
2fb50 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2fb60 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50   or the.    ** P
2fb70 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65  ENDING_BYTE page
2fb80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
2fb90 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54  le( pgnoRoot==PT
2fba0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
2fbb0 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20   pgnoRoot) ||.  
2fbc0 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d        pgnoRoot==
2fbd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2fbe0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
2fbf0 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20  pgnoRoot++;.    
2fc00 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  }.    assert( pg
2fc10 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20  noRoot>=3 );..  
2fc20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
2fc30 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74  page. The page t
2fc40 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  hat currently re
2fc50 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f  sides at pgnoRoo
2fc60 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
2fc70 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c   moved to the al
2fc80 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e  located page (un
2fc90 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74  less the allocat
2fca0 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a  ed page happens.
2fcb0 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65      ** to reside
2fcc0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20   at pgnoRoot).. 
2fcd0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61     */.    rc = a
2fce0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2fcf0 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65  (pBt, &pPageMove
2fd00 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e  , &pgnoMove, pgn
2fd10 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69  oRoot, 1);.    i
2fd20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fd30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2fd40 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
2fd50 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67  if( pgnoMove!=pg
2fd60 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
2fd70 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  /* pgnoRoot is t
2fd80 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  he page that wil
2fd90 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
2fda0 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20  e root-page of. 
2fdb0 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
2fdc0 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20  table (assuming 
2fdd0 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74  an error did not
2fde0 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20   occur). But we 
2fdf0 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  were.      ** al
2fe00 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65  located pgnoMove
2fe10 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69  . If required (i
2fe20 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f  .e. if it was no
2fe30 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  t allocated.    
2fe40 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e    ** by extendin
2fe50 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65  g the file), the
2fe60 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74   current page at
2fe70 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f   position pgnoMo
2fe80 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  ve.      ** is a
2fe90 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64  lready journaled
2fea0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2feb0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
2fec0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
2fed0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2fee0 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a  ge(pPageMove);..
2fef0 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68        /* Move th
2ff00 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
2ff10 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20   at pgnoRoot to 
2ff20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20  pgnoMove. */.   
2ff30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2ff40 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2ff50 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
2ff60 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
2ff70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ff80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2ff90 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2ffa0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
2ffb0 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
2ffc0 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
2ffd0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2ffe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2fff0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
30000 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
30010 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
30020 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
30030 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
30040 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30050 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
30060 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
30070 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
30080 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30090 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
300a0 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
300b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
300c0 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
300d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
300e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
300f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
30100 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
30110 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30120 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
30130 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
30140 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
30150 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
30160 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  pgnoMove, 0);.  
30170 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30180 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
30190 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
301a0 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
301b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
301c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
301d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
301e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
301f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
30200 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
30210 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
30220 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
30230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30240 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
30260 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30270 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
30280 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
30290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
302a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
302b0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
302c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
302d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
302e0 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
302f0 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
30300 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
30310 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
30320 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
30330 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
30340 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
30350 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
30360 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
30370 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
30380 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
30390 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
303a0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
303b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
303c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
303d0 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
303e0 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
303f0 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
30400 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
30410 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
30420 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
30430 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
30440 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
30450 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
30460 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
30470 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
30480 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30490 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
304a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
304b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
304c0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
304d0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
304e0 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
304f0 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
30500 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
30510 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
30520 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
30530 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
30540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
30550 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
30560 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
30570 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
30580 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
30590 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
305a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
305b0 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20  .  p->pBt->db = 
305c0 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74  p->db;.  rc = bt
305d0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
305e0 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  , piTable, flags
305f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
30600 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
30610 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30620 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
30630 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
30640 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
30650 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
30660 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
30670 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
30680 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
30690 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
306a0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
306b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
306c0 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
306d0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
306e0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
306f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
30700 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
30710 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
30720 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
30730 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  nt page.  NULL f
30740 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20  or the root */. 
30750 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
30760 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g      /* Deallo
30770 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
30780 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
30790 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
307a0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
307b0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
307c0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
307d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
307e0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
307f0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
30800 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
30810 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
30820 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30830 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
30840 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41    }..  rc = getA
30850 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
30860 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70 50  pgno, &pPage, pP
30870 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
30880 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
30890 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
308a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
308b0 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
308c0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
308d0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
308e0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
308f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
30900 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
30910 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
30920 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65  te(pCell), pPage
30930 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
30940 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
30950 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
30960 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
30970 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
30980 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
30990 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
309a0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
309b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
309c0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
309d0 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
309e0 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
309f0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
30a00 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2c 20 31  ta[8]), pPage, 1
30a10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
30a20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
30a30 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  sepage_out;.  }.
30a40 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c    if( freePageFl
30a50 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ag ){.    rc = f
30a60 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
30a70 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
30a80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30a90 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
30aa0 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ge))==0 ){.    z
30ab0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
30ac0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c  Page->aData[0] |
30ad0 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a   PTF_LEAF);.  }.
30ae0 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61  .cleardatabasepa
30af0 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  ge_out:.  releas
30b00 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30b10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30b20 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  .** Delete all i
30b30 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
30b40 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
30b50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
30b60 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68   iTable is.** th
30b70 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
30b80 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
30b90 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74   table.  After t
30ba0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
30bb0 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74  rns,.** the root
30bc0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20   page is empty, 
30bd0 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73  but still exists
30be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
30bf0 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
30c00 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
30c10 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
30c20 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20  ny open.** read 
30c30 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
30c40 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74  able.  Open writ
30c50 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f  e cursors are mo
30c60 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f  ved to the.** ro
30c70 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
30c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
30c90 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42  treeClearTable(B
30ca0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
30cb0 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ble){.  int rc;.
30cc0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
30cd0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
30ce0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
30cf0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
30d00 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  >db;.  if( p->in
30d10 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
30d20 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  TE ){.    rc = p
30d30 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
30d40 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
30d50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
30d60 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
30d70 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
30d80 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29  p, iTable, 0, 1)
30d90 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
30da0 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74      /* nothing t
30db0 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  o do */.  }else 
30dc0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
30dd0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
30de0 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c  ors(pBt, iTable,
30df0 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e   0)) ){.    /* n
30e00 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a  othing to do */.
30e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
30e20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
30e30 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
30e40 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Table, 0, 0);.  
30e50 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
30e60 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
30e70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30e80 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  Erase all inform
30e90 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65  ation in a table
30ea0 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f   and add the roo
30eb0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  t of the table t
30ec0 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73  o.** the freelis
30ed0 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20  t.  Except, the 
30ee0 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e  root of the prin
30ef0 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65  ciple table (the
30f00 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20   one on.** page 
30f10 31 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65  1) is never adde
30f20 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
30f30 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
30f40 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
30f50 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
30f60 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
30f70 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73  any open.** curs
30f80 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ors on the table
30f90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56  ..**.** If AUTOV
30fa0 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64  ACUUM is enabled
30fb0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74   and the page at
30fc0 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74   iTable is not t
30fd0 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20  he last.** root 
30fe0 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
30ff0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
31000 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
31010 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ge .** in the da
31020 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d  tabase file is m
31030 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c  oved into the sl
31040 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
31050 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c  pied by.** iTabl
31060 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20  e and that last 
31070 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
31080 63 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61  cupied by the la
31090 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  st root page.** 
310a0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
310b0 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64  freelist instead
310c0 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20   of iTable.  In 
310d0 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a  this say, all.**
310e0 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20   root pages are 
310f0 6b 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69  kept at the begi
31100 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
31110 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
31120 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72  h.** is necessar
31130 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d  y for AUTOVACUUM
31140 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20   to work right. 
31150 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
31160 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   to the .** page
31170 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65   number that use
31180 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74  d to be the last
31190 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
311a0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a  e file before.**
311b0 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e   the move.  If n
311c0 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65  o page gets move
311d0 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  d, *piMoved is s
311e0 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20  et to 0..** The 
311f0 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
31200 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65  s recorded in me
31210 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61  ta[3] and the va
31220 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33  lue of.** meta[3
31230 5d 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20  ] is updated by 
31240 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a  this procedure..
31250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
31260 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
31270 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
31280 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
31290 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
312a0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
312b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
312c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
312d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
312e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
312f0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   );.  if( p->inT
31300 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
31310 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
31320 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
31330 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
31340 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
31350 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
31360 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20  illegal to drop 
31370 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63  a table if any c
31380 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20  ursors are open 
31390 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
313a0 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65  base. This is be
313b0 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  cause in auto-va
313c0 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61  cuum mode the ba
313d0 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e  ckend may.  ** n
313e0 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74  eed to move anot
313f0 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f  her root-page to
31400 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74   fill a gap left
31410 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a   by the deleted.
31420 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20    ** root page. 
31430 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  If an open curso
31440 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73  r was using this
31450 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20   page a problem 
31460 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75  would .  ** occu
31470 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
31480 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  t->pCursor ){.  
31490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
314a0 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72  LOCKED;.  }..  r
314b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
314c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67  GetPage(pBt, (Pg
314d0 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67  no)iTable, &pPag
314e0 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  e, 0);.  if( rc 
314f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
31500 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
31510 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54  ClearTable(p, iT
31520 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20  able);.  if( rc 
31530 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
31540 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
31550 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
31560 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a   *piMoved = 0;..
31570 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29    if( iTable>1 )
31580 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
31590 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
315a0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
315b0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
315c0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
315d0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
315e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
315f0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61  ){.      Pgno ma
31600 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
31610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
31620 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20  eeGetMeta(p, 4, 
31630 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20  &maxRootPgno);. 
31640 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31660 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
31670 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
31680 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
31690 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ..      if( iTab
316a0 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20  le==maxRootPgno 
316b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
316c0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
316d0 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20   dropped is the 
316e0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c  table with the l
316f0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
31700 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
31710 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
31720 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74  se, put the root
31730 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65   page on the fre
31740 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  e list. .       
31750 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
31760 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
31770 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
31780 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
31790 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
317a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
317b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
317c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
317d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
317e0 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
317f0 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e  g dropped does n
31800 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67  ot have the larg
31810 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
31820 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
31830 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
31840 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67   So move the pag
31850 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f  e that does into
31860 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
31870 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
31880 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61   deleted root-pa
31890 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ge..        */. 
318a0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
318b0 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72  pMove;.        r
318c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
318d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
318e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
318f0 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
31900 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29  Pgno, &pMove, 0)
31910 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31920 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31930 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
31940 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
31950 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
31960 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f  atePage(pBt, pMo
31970 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ve, PTRMAP_ROOTP
31980 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20  AGE, 0, iTable, 
31990 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  0);.        rele
319a0 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
319b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
319c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
319d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
319e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
319f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31a00 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
31a10 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26  , maxRootPgno, &
31a20 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20  pMove, 0);.     
31a30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
31a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
31a70 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f  c = freePage(pMo
31a80 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ve);.        rel
31a90 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
31aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
31ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31ac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
31ad0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
31ae0 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20       *piMoved = 
31af0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
31b00 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
31b10 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d  et the new 'max-
31b20 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65  root-page' value
31b30 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
31b40 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20   header. This.  
31b50 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c      ** is the ol
31b60 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65  d value less one
31b70 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20  , less one more 
31b80 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20  if that happens 
31b90 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61  to.      ** be a
31ba0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
31bb0 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69  r, less one agai
31bc0 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65  n if that is the
31bd0 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  .      ** PENDIN
31be0 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20  G_BYTE_PAGE..   
31bf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52     */.      maxR
31c00 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
31c10 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f   if( maxRootPgno
31c20 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
31c30 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
31c40 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
31c50 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
31c60 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f   if( maxRootPgno
31c70 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
31c80 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
31c90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78  ) ){.        max
31ca0 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
31cb0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
31cc0 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50  ( maxRootPgno!=P
31cd0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
31ce0 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20  (pBt) );..      
31cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
31d00 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
31d10 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a  , maxRootPgno);.
31d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31d30 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
31d40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c  Page);.      rel
31d50 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
31d60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
31d70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
31d80 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
31d90 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65  pTable was calle
31da0 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a  d on page 1. */.
31db0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
31dc0 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ge, PTF_INTKEY|P
31dd0 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72  TF_LEAF );.    r
31de0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
31df0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
31e00 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69  rc;  .}.int sqli
31e10 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
31e20 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
31e30 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d  iTable, int *piM
31e40 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
31e50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
31e60 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
31e70 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
31e80 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54   rc = btreeDropT
31e90 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20  able(p, iTable, 
31ea0 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69  piMoved);.  sqli
31eb0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
31ec0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
31ed0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
31ee0 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69  e meta-informati
31ef0 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61  on out of a data
31f00 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61  base file.  Meta
31f10 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75  [0].** is the nu
31f20 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67  mber of free pag
31f30 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
31f40 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
31f50 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67  eta[1].** throug
31f60 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61  h meta[15] are a
31f70 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
31f80 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72   by higher layer
31f90 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  s.  Meta[0].** i
31fa0 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65  s read-only, the
31fb0 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64   others are read
31fc0 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  /write..** .** T
31fd0 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20  he schema layer 
31fe0 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c  numbers meta val
31ff0 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e  ues differently.
32000 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a    At the schema.
32010 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68  ** layer (and th
32020 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20  e SetCookie and 
32030 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64  ReadCookie opcod
32040 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  es) the number o
32050 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20  f.** free pages 
32060 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20  is not visible. 
32070 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73   So Cookie[0] is
32080 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74   the same as Met
32090 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  a[1]..*/.int sql
320a0 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
320b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
320c0 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b  dx, u32 *pMeta){
320d0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
320e0 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ge;.  int rc;.  
320f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
32100 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  P1;.  BtShared *
32110 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
32120 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
32130 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
32140 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
32150 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d 64  Reading a meta-d
32160 61 74 61 20 76 61 6c 75 65 20 72 65 71 75 69 72  ata value requir
32170 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
32180 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20 68 65  n page 1 (and he
32190 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c  nce.  ** the sql
321a0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
321b0 2e 20 57 65 20 67 72 61 62 20 74 68 69 73 20 6c  . We grab this l
321c0 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ock regardless o
321d0 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20 2a  f whether or.  *
321e0 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54 45  * not the SQLITE
321f0 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
32200 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 74 68   flag is set (th
32210 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
32220 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69 73  t page.  ** 1 is
32230 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73 70   treated as a sp
32240 65 63 69 61 6c 20 63 61 73 65 20 62 79 20 71 75  ecial case by qu
32250 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61  eryTableLock() a
32260 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e  nd lockTable()).
32270 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  .  */.  rc = que
32280 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31  ryTableLock(p, 1
32290 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
322a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
322b0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
322c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
322d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
322e0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  }..  assert( idx
322f0 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29  >=0 && idx<=15 )
32300 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
32310 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
32320 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67  ager, 1, &pDbPag
32330 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
32340 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
32350 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
32360 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
32370 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  P1 = (unsigned c
32380 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
32390 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
323a0 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67  e);.  *pMeta = g
323b0 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  et4byte(&pP1[36 
323c0 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c  + idx*4]);.  sql
323d0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
323e0 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49  DbPage);..  /* I
323f0 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69  f autovacuumed i
32400 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
32410 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20  is build but we 
32420 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20  are trying to . 
32430 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75   ** access an au
32440 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62  tovacuumed datab
32450 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  ase, then make t
32460 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64  he database read
32470 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64  only. .  */.#ifd
32480 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32490 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
324a0 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61  idx==4 && *pMeta
324b0 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e  >0 ) pBt->readOn
324c0 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  ly = 1;.#endif..
324d0 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65    /* Grab the re
324e0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
324f0 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63  1. */.  rc = loc
32500 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41  kTable(p, 1, REA
32510 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74  D_LOCK);.  sqlit
32520 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
32530 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32540 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74  ./*.** Write met
32550 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61  a-information ba
32560 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
32570 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69  base.  Meta[0] i
32580 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61  s.** read-only a
32590 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72  nd may not be wr
325a0 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  itten..*/.int sq
325b0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
325c0 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69  Meta(Btree *p, i
325d0 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74  nt idx, u32 iMet
325e0 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  a){.  BtShared *
325f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
32600 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
32610 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  P1;.  int rc;.  
32620 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26  assert( idx>=1 &
32630 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73  & idx<=15 );.  s
32640 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
32650 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
32660 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
32670 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
32680 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20  WRITE ){.    rc 
32690 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
326a0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
326b0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
326c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
326d0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
326e0 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31  e1!=0 );.    pP1
326f0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   = pBt->pPage1->
32700 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
32710 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32720 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
32730 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
32740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32750 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
32760 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
32770 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64  ], iMeta);.#ifnd
32780 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32790 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
327a0 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20  if( idx==7 ){.  
327b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
327c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c  t->autoVacuum ||
327d0 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20   iMeta==0 );.   
327e0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 65       assert( iMe
327f0 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d  ta==0 || iMeta==
32800 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74  1 );.        pBt
32810 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 69  ->incrVacuum = i
32820 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Meta;.      }.#e
32830 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ndif.    }.  }. 
32840 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
32850 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
32860 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
32870 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74  urn the flag byt
32880 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  e at the beginni
32890 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ng of the page t
328a0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
328b0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  * is currently p
328c0 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69  ointing to..*/.i
328d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
328e0 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70  lags(BtCursor *p
328f0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
32900 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53   What about CURS
32910 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73  OR_REQUIRESEEK s
32920 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e  tate? Probably n
32930 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  eed to call.  **
32940 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
32950 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20  sition() here.. 
32960 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
32970 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43  Page;.  restoreC
32980 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
32990 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ur);.  pPage = p
329a0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
329b0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
329c0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
329d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
329e0 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20  >pBt==pCur->pBt 
329f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
32a00 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e ? pPage->aData
32a10 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
32a20 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  t] : 0;.}.../*.*
32a30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
32a40 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
32a50 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69  th a BTree.  Thi
32a60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
32a70 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
32a80 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
32a90 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73  nly..*/.Pager *s
32aa0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
32ab0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
32ac0 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61  turn p->pBt->pPa
32ad0 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ger;.}..#ifndef 
32ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
32af0 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
32b00 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
32b10 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
32b20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
32b30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
32b40 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
32b50 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
32b60 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
32b70 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
32b80 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
32b90 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
32ba0 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b  p;.  if( !pCheck
32bb0 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e  ->mxErr ) return
32bc0 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72  ;.  pCheck->mxEr
32bd0 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e  r--;.  pCheck->n
32be0 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72  Err++;.  va_star
32bf0 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
32c00 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72    if( pCheck->er
32c10 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20  rMsg.nChar ){.  
32c20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
32c30 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
32c40 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31  >errMsg, "\n", 1
32c50 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73  );.  }.  if( zMs
32c60 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g1 ){.    sqlite
32c70 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
32c80 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
32c90 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d   zMsg1, -1);.  }
32ca0 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e  .  sqlite3VXPrin
32cb0 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d  tf(&pCheck->errM
32cc0 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20  sg, 1, zFormat, 
32cd0 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
32ce0 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  );.  if( pCheck-
32cf0 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46 61  >errMsg.mallocFa
32d00 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43 68 65  iled ){.    pChe
32d10 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ck->mallocFailed
32d20 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 1;.  }.}.#end
32d30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
32d40 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
32d50 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
32d60 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
32d70 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
32d80 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66  Add 1 to the ref
32d90 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
32da0 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66   page iPage.  If
32db0 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
32dc0 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ond.** reference
32dd0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64   to the page, ad
32de0 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
32df0 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45  ge to pCheck->zE
32e00 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e  rrMsg..** Return
32e10 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20   1 if there are 
32e20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72  2 ore more refer
32e30 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
32e40 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66  e and 0 if.** if
32e50 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
32e60 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
32e70 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
32e80 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20  Also check that 
32e90 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
32ea0 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f  is in bounds..*/
32eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
32ec0 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b  kRef(IntegrityCk
32ed0 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50   *pCheck, int iP
32ee0 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74  age, char *zCont
32ef0 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67  ext){.  if( iPag
32f00 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
32f10 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43 68  .  if( iPage>pCh
32f20 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50  eck->nPage || iP
32f30 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65  age<0 ){.    che
32f40 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32f50 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
32f60 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
32f70 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  er %d", iPage);.
32f80 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
32f90 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  }.  if( pCheck->
32fa0 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20  anRef[iPage]==1 
32fb0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
32fc0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
32fd0 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66  ontext, "2nd ref
32fe0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25  erence to page %
32ff0 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
33000 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
33010 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d  return  (pCheck-
33020 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29  >anRef[iPage]++)
33030 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  >1;.}..#ifndef S
33040 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33050 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ACUUM./*.** Chec
33060 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  k that the entry
33070 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
33080 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68  map for page iCh
33090 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20  ild maps to .** 
330a0 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f  page iParent, po
330b0 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79  inter type ptrTy
330c0 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65  pe. If not, appe
330d0 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
330e0 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b  age.** to pCheck
330f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
33100 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20   checkPtrmap(.  
33110 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
33120 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72  eck,   /* Integr
33130 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78  ity check contex
33140 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  t */.  Pgno iChi
33150 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ld,           /*
33160 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62   Child page numb
33170 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  er */.  u8 eType
33180 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
33190 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
331a0 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20  er map type */. 
331b0 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20   Pgno iParent,  
331c0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
331d0 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
331e0 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
331f0 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  er */.  char *zC
33200 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f  ontext         /
33210 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69  * Context descri
33220 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20  ption (used for 
33230 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b  error msg) */.){
33240 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20  .  int rc;.  u8 
33250 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50  ePtrmapType;.  P
33260 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e  gno iPtrmapParen
33270 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61  t;..  rc = ptrma
33280 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74  pGet(pCheck->pBt
33290 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d  , iChild, &ePtrm
332a0 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70  apType, &iPtrmap
332b0 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
332c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
332d0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
332e0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
332f0 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20  ext, "Failed to 
33300 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d  read ptrmap key=
33310 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  %d", iChild);.  
33320 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
33330 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65   if( ePtrmapType
33340 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d  !=eType || iPtrm
33350 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e  apParent!=iParen
33360 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  t ){.    checkAp
33370 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
33380 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
33390 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e   "Bad ptr map en
333a0 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63  try key=%d expec
333b0 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d  ted=(%d,%d) got=
333c0 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20  (%d,%d)", .     
333d0 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20   iChild, eType, 
333e0 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70  iParent, ePtrmap
333f0 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72  Type, iPtrmapPar
33400 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ent);.  }.}.#end
33410 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
33420 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
33430 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72   the freelist or
33440 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
33450 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65  page list..** Ve
33460 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
33470 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
33480 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a   the list is N..
33490 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
334a0 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65  heckList(.  Inte
334b0 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
334c0 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63    /* Integrity c
334d0 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  hecking context 
334e0 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c  */.  int isFreeL
334f0 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  ist,       /* Tr
33500 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73  ue for a freelis
33510 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76  t.  False for ov
33520 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
33530 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
33540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
33550 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66  age number for f
33560 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  irst page in the
33570 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e   list */.  int N
33580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33590 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d   /* Expected num
335a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
335b0 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68  the list */.  ch
335c0 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
335d0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66      /* Context f
335e0 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
335f0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
33600 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20  .  int expected 
33610 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  = N;.  int iFirs
33620 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69  t = iPage;.  whi
33630 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70  le( N-- > 0 && p
33640 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a  Check->mxErr ){.
33650 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66      DbPage *pOvf
33660 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67  lPage;.    unsig
33670 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44  ned char *pOvflD
33680 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61  ata;.    if( iPa
33690 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68  ge<1 ){.      ch
336a0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
336b0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
336c0 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25          "%d of %
336d0 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20  d pages missing 
336e0 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69  from overflow li
336f0 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25  st starting at %
33700 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b  d",.          N+
33710 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69  1, expected, iFi
33720 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rst);.      brea
33730 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
33740 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
33750 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
33760 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  t) ) break;.    
33770 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
33780 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67  Get(pCheck->pPag
33790 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  er, (Pgno)iPage,
337a0 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a   &pOvflPage) ){.
337b0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
337c0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
337d0 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74  ntext, "failed t
337e0 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20  o get page %d", 
337f0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72  iPage);.      br
33800 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
33810 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69  OvflData = (unsi
33820 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
33830 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
33840 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20  pOvflPage);.    
33850 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29  if( isFreeList )
33860 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
33870 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
33880 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66  ata[4]);.#ifndef
33890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
338a0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
338b0 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
338c0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
338d0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
338e0 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
338f0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
33900 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
33910 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
33920 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b      if( n>pCheck
33930 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
33940 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  e/4-2 ){.       
33950 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
33960 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
33970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 72  ,.           "fr
33980 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e  eelist leaf coun
33990 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67  t too big on pag
339a0 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
339b0 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20         N--;.    
339c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
339d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
339e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ++){.          P
339f0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20  gno iFreePage = 
33a00 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
33a10 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66  ata[8+i*4]);.#if
33a20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33a30 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33a40 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
33a50 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
33a60 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  m ){.           
33a70 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
33a80 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
33a90 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
33aa0 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
33ab0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
33ac0 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  f.          chec
33ad0 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72  kRef(pCheck, iFr
33ae0 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74  eePage, zContext
33af0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33b00 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20       N -= n;.   
33b10 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
33b20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
33b30 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c  UTOVACUUM.    el
33b40 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
33b50 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 75  this database su
33b60 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
33b70 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73 20  um and iPage is 
33b80 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20  not the last.   
33b90 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
33ba0 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  is overflow list
33bb0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
33bc0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
33bd0 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ry for.      ** 
33be0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
33bf0 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67 65  ge matches iPage
33c00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33c10 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
33c20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
33c30 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  N>0 ){.        i
33c40 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
33c50 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  lData);.        
33c60 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
33c70 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56  ck, i, PTRMAP_OV
33c80 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20  ERFLOW2, iPage, 
33c90 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
33ca0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
33cb0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
33cc0 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
33cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
33ce0 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65  rUnref(pOvflPage
33cf0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
33d00 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
33d10 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
33d20 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
33d30 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
33d40 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20  _CHECK./*.** Do 
33d50 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63  various sanity c
33d60 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c  hecks on a singl
33d70 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65 65  e page of a tree
33d80 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
33d90 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f   tree depth.  Ro
33da0 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e 20  ot pages return 
33db0 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72  0.  Parents of r
33dc0 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74  oot pages.** ret
33dd0 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f  urn 1, and so fo
33de0 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73  rth..** .** Thes
33df0 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e  e checks are don
33e00 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e  e:.**.**      1.
33e10 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74    Make sure that
33e20 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62   cells and freeb
33e30 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65  locks do not ove
33e40 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20  rlap.**         
33e50 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20   but combine to 
33e60 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72  completely cover
33e70 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e   the page..**  N
33e80 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  2.  Make sure
33e90 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69   cell keys are i
33ea0 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20  n order..**  NO 
33eb0 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e   3.  Make sure n
33ec0 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68  o key is less th
33ed0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
33ee0 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  LowerBound..**  
33ef0 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72  NO  4.  Make sur
33f00 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61  e no key is grea
33f10 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
33f20 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64  l to zUpperBound
33f30 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68  ..**      5.  Ch
33f40 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
33f50 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  y of overflow pa
33f60 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20  ges..**      6. 
33f70 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c   Recursively cal
33f80 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 20  l checkTreePage 
33f90 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e  on all children.
33fa0 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72  .**      7.  Ver
33fb0 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65 70  ify that the dep
33fc0 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  th of all childr
33fd0 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a  en is the same..
33fe0 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65  **      8.  Make
33ff0 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65 20   sure this page 
34000 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25 20  is at least 33% 
34010 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20  full or else it 
34020 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  is.**          t
34030 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
34040 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
34050 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  nt checkTreePage
34060 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
34070 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e  *pCheck,  /* Con
34080 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e  text for the san
34090 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69  ity check */.  i
340a0 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
340b0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
340c0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
340d0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65  to check */.  Me
340e0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
340f0 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
34100 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ge */.  char *zP
34110 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a  arentContext  /*
34120 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20   Parent context 
34130 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
34140 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c  *pPage;.  int i,
34150 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20   rc, depth, d2, 
34160 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74  pgno, cnt;.  int
34170 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b   hdr, cellStart;
34180 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
34190 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68  u8 *data;.  BtSh
341a0 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74  ared *pBt;.  int
341b0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63   usableSize;.  c
341c0 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30  har zContext[100
341d0 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a  ];.  char *hit;.
341e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
341f0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
34200 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  ext), zContext, 
34210 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61  "Page %d: ", iPa
34220 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ge);..  /* Check
34230 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 65   that the page e
34240 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74  xists.  */.  pBt
34250 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a   = pCheck->pBt;.
34260 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
34270 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
34280 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
34290 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
342a0 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
342b0 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74  , iPage, zParent
342c0 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75 72  Context) ) retur
342d0 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  n 0;.  if( (rc =
342e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
342f0 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
34300 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
34310 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
34320 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
34330 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
34340 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
34350 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65 72  get the page. er
34360 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63  ror code=%d", rc
34370 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
34380 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d  .  }.  if( (rc =
34390 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
343a0 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
343b0 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20  rent))!=0 ){.   
343c0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
343d0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
343e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
343f0 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74        "sqlite3Bt
34400 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 72 65  reeInitPage() re
34410 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65  turns error code
34420 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72   %d", rc);.    r
34430 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
34440 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
34450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
34460 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c   out all the cel
34470 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68  ls..  */.  depth
34480 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
34490 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   i<pPage->nCell 
344a0 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
344b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
344c0 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
344d0 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  z;.    CellInfo 
344e0 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  info;..    /* Ch
344f0 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72  eck payload over
34500 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
34510 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
34520 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
34530 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78  ontext), zContex
34540 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
34550 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64  "On tree page %d
34560 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61   cell %d: ", iPa
34570 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c  ge, i);.    pCel
34580 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
34590 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge,i);.    sqlit
345a0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
345b0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
345c0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a  , &info);.    sz
345d0 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20   = info.nData;. 
345e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
345f0 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e  ntKey ) sz += in
34600 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73  fo.nKey;.    ass
34610 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50  ert( sz==info.nP
34620 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66  ayload );.    if
34630 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ( sz>info.nLocal
34640 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
34650 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f  age = (sz - info
34660 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65  .nLocal + usable
34670 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c  Size - 5)/(usabl
34680 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
34690 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
346a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
346b0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
346c0 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
346d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
346e0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
346f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
34700 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
34710 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
34720 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
34730 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a  RFLOW1, iPage, z
34740 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
34750 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  }.#endif.      c
34760 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c  heckList(pCheck,
34770 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50   0, pgnoOvfl, nP
34780 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
34790 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
347a0 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65  eck sanity of le
347b0 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ft child page.. 
347c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
347d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
347e0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
347f0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e  yte(pCell);.#ifn
34800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34810 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
34820 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
34830 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
34840 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
34850 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ck, pgno, PTRMAP
34860 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a  _BTREE, iPage, z
34870 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
34880 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  }.#endif.      d
34890 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67  2 = checkTreePag
348a0 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50  e(pCheck,pgno,pP
348b0 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  age,zContext);. 
348c0 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
348d0 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20  d2!=depth ){.   
348e0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
348f0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
34900 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67  text, "Child pag
34910 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22  e depth differs"
34920 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34930 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20   depth = d2;.   
34940 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50   }.  }.  if( !pP
34950 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
34960 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
34970 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
34980 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
34990 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  8]);.    sqlite3
349a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
349b0 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
349c0 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
349d0 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
349e0 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74  page %d at right
349f0 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65   child: ", iPage
34a00 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
34a10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34a20 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
34a30 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
34a40 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
34a50 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
34a60 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
34a70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
34a80 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
34a90 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
34aa0 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65  o, pPage, zConte
34ab0 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  xt);.  }. .  /* 
34ac0 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65  Check for comple
34ad0 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74  te coverage of t
34ae0 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64  he page.  */.  d
34af0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
34b00 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
34b10 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
34b20 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  hit = sqlite3Pag
34b30 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
34b40 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  geSize );.  if( 
34b50 68 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  hit==0 ){.    pC
34b60 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  heck->mallocFail
34b70 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
34b80 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c  .    memset(hit,
34b90 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 29   0, usableSize )
34ba0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74  ;.    memset(hit
34bb0 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64  , 1, get2byte(&d
34bc0 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20  ata[hdr+5]));.  
34bd0 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
34be0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
34bf0 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20  ;.    cellStart 
34c00 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
34c10 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
34c20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
34c30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
34c40 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
34c50 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b  &data[cellStart+
34c60 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36  i*2]);.      u16
34c70 20 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20   size = 1024;.  
34c80 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
34c90 20 69 66 28 20 70 63 3c 3d 75 73 61 62 6c 65 53   if( pc<=usableS
34ca0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ize ){.        s
34cb0 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
34cc0 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
34cd0 63 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c]);.      }.   
34ce0 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d     if( (pc+size-
34cf0 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  1)>=usableSize |
34d00 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  | pc<0 ){.      
34d10 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34d20 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
34d30 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70           "Corrup
34d40 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
34d50 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65   cell %d on page
34d60 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b   %d",i,iPage,0);
34d70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34d80 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73        for(j=pc+s
34d90 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d  ize-1; j>=pc; j-
34da0 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
34db0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
34dc0 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32  or(cnt=0, i=get2
34dd0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
34de0 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61  ]); i>0 && i<usa
34df0 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31  bleSize && cnt<1
34e00 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20  0000; .         
34e10 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20    cnt++){.      
34e20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62  int size = get2b
34e30 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b  yte(&data[i+2]);
34e40 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
34e50 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d      if( (i+size-
34e60 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  1)>=usableSize |
34e70 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  | i<0 ){.       
34e80 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
34e90 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20  pCheck, 0,  .   
34ea0 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70           "Corrup
34eb0 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
34ec0 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65   cell %d on page
34ed0 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b   %d",i,iPage,0);
34ee0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34ef0 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69        for(j=i+si
34f00 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29  ze-1; j>=i; j--)
34f10 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20   hit[j]++;.     
34f20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74   }.      i = get
34f30 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b  2byte(&data[i]);
34f40 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
34f50 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65  =cnt=0; i<usable
34f60 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Size; i++){.    
34f70 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20    if( hit[i]==0 
34f80 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  ){.        cnt++
34f90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
34fa0 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20  ( hit[i]>1 ){.  
34fb0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
34fc0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a  dMsg(pCheck, 0,.
34fd0 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69            "Multi
34fe0 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74  ple uses for byt
34ff0 65 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22  e %d of page %d"
35000 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  , i, iPage);.   
35010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35020 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
35030 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b  ( cnt!=data[hdr+
35040 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  7] ){.      chec
35050 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
35060 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
35070 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61   "Fragmented spa
35080 63 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65  ce is %d byte re
35090 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20  ported as %d on 
350a0 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20  page %d",.      
350b0 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64      cnt, data[hd
350c0 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  r+7], iPage);.  
350d0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
350e0 33 50 61 67 65 46 72 65 65 28 68 69 74 29 3b 0a  3PageFree(hit);.
350f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
35100 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
35110 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69  depth+1;.}.#endi
35120 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
35130 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
35140 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
35150 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
35160 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54  TY_CHECK./*.** T
35170 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
35180 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63   a complete chec
35190 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42  k of the given B
351a0 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f  Tree file.  aRoo
351b0 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72  t[] is.** an arr
351c0 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62  ay of pages numb
351d0 65 72 73 20 77 65 72 65 20 65 61 63 68 20 70 61  ers were each pa
351e0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  ge number is the
351f0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a   root page of.**
35200 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74   a table.  nRoot
35210 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
35220 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
35230 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ot..**.** Write 
35240 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
35250 72 6f 72 20 73 65 65 6e 20 69 6e 20 2a 70 6e 45  ror seen in *pnE
35260 72 72 2e 20 20 45 78 63 65 70 74 20 66 6f 72 20  rr.  Except for 
35270 73 6f 6d 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  some memory.** a
35280 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 73  llocation errors
35290 2c 20 20 6e 6e 20 65 72 72 6f 72 20 6d 65 73 73  ,  nn error mess
352a0 61 67 65 20 69 73 20 68 65 6c 64 20 69 6e 20 6d  age is held in m
352b0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
352c0 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 69 73  rom.** malloc is
352d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 2a 70 6e   returned if *pn
352e0 45 72 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  Err is non-zero.
352f0 20 20 49 66 20 2a 70 6e 45 72 72 3d 3d 30 20 74    If *pnErr==0 t
35300 68 65 6e 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 72  hen NULL is.** r
35310 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
35320 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e   *sqlite3BtreeIn
35330 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20  tegrityCheck(.  
35340 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a  Btree *p,     /*
35350 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   The btree to be
35360 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e   checked */.  in
35370 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41  t *aRoot,   /* A
35380 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20  n array of root 
35390 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f  pages numbers fo
353a0 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65  r individual tre
353b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f  es */.  int nRoo
353c0 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  t,    /* Number 
353d0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
353e0 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d  oot[] */.  int m
353f0 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70  xErr,    /* Stop
35400 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72   reporting error
35410 73 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e  s after this man
35420 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72  y */.  int *pnEr
35430 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75  r    /* Write nu
35440 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
35450 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69  een to this vari
35460 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
35470 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a   i;.  int nRef;.
35480 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43    IntegrityCk sC
35490 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64  heck;.  BtShared
354a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
354b0 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30 30 5d    char zErr[100]
354c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
354d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
354e0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
354f0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
35500 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
35510 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
35520 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
35530 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ry(p)!=SQLITE_OK
35540 20 29 7b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d   ){.    *pnErr =
35550 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   1;.    sqlite3B
35560 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
35570 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
35580 44 62 53 74 72 44 75 70 28 30 2c 20 22 63 61 6e  DbStrDup(0, "can
35590 6e 6f 74 20 61 63 71 75 69 72 65 20 61 20 72 65  not acquire a re
355a0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
355b0 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20  atabase");.  }. 
355c0 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42   sCheck.pBt = pB
355d0 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67  t;.  sCheck.pPag
355e0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
355f0 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  ;.  sCheck.nPage
35600 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
35610 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
35620 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72  ;.  sCheck.mxErr
35630 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65   = mxErr;.  sChe
35640 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73  ck.nErr = 0;.  s
35650 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c  Check.mallocFail
35660 65 64 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72  ed = 0;.  *pnErr
35670 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
35680 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
35690 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
356a0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
356b0 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20   sCheck.nPage = 
356c0 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d  pBt->nTrunc;.  }
356d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43  .#endif.  if( sC
356e0 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b  heck.nPage==0 ){
356f0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
35700 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
35710 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
35720 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
35730 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
35740 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
35750 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43 68 65  te3Malloc( (sChe
35760 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65  ck.nPage+1)*size
35770 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  of(sCheck.anRef[
35780 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43  0]) );.  if( !sC
35790 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20  heck.anRef ){.  
357a0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
357b0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
357c0 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20  *pnErr = 1;.    
357d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
357e0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
357f0 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
35800 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  0; i<=sCheck.nPa
35810 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b  ge; i++){ sCheck
35820 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d  .anRef[i] = 0; }
35830 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42  .  i = PENDING_B
35840 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20  YTE_PAGE(pBt);. 
35850 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e   if( i<=sCheck.n
35860 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65  Page ){.    sChe
35870 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b  ck.anRef[i] = 1;
35880 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
35890 72 41 63 63 75 6d 49 6e 69 74 28 26 73 43 68 65  rAccumInit(&sChe
358a0 63 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72 72 2c  ck.errMsg, zErr,
358b0 20 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 20 32   sizeof(zErr), 2
358c0 30 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  0000);..  /* Che
358d0 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
358e0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
358f0 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73  .  */.  checkLis
35900 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65  t(&sCheck, 1, ge
35910 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
35920 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c  ge1->aData[32]),
35930 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
35940 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
35950 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20  e1->aData[36]), 
35960 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20  "Main freelist: 
35970 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ");..  /* Check 
35980 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a  all the tables..
35990 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
359a0 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63  i<nRoot && sChec
359b0 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20  k.mxErr; i++){. 
359c0 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d     if( aRoot[i]=
359d0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  =0 ) continue;.#
359e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
359f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
35a00 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
35a10 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69  acuum && aRoot[i
35a20 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ]>1 ){.      che
35a30 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b  ckPtrmap(&sCheck
35a40 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d  , aRoot[i], PTRM
35a50 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
35a60 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
35a70 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
35a80 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ge(&sCheck, aRoo
35a90 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f  t[i], 0, "List o
35aa0 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29  f tree roots: ")
35ab0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
35ac0 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65   sure every page
35ad0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
35ae0 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a  referenced.  */.
35af0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43    for(i=1; i<=sC
35b00 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43  heck.nPage && sC
35b10 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29  heck.mxErr; i++)
35b20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
35b30 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
35b40 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
35b50 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  nRef[i]==0 ){.  
35b60 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
35b70 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
35b80 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72  Page %d is never
35b90 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20   used", i);.    
35ba0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49  }.#else.    /* I
35bb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
35bc0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
35bd0 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e  uum, make sure n
35be0 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e  o tables contain
35bf0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
35c00 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61  es to pointer-ma
35c10 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a  p pages..    */.
35c20 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
35c30 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20  nRef[i]==0 && . 
35c40 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
35c50 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20  GENO(pBt, i)!=i 
35c60 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  || !pBt->autoVac
35c70 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68  uum) ){.      ch
35c80 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
35c90 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25  heck, 0, "Page %
35ca0 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22  d is never used"
35cb0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , i);.    }.    
35cc0 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  if( sCheck.anRef
35cd0 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20  [i]!=0 && .     
35ce0 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f    (PTRMAP_PAGENO
35cf0 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70  (pBt, i)==i && p
35d00 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20  Bt->autoVacuum) 
35d10 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
35d20 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
35d30 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70   0, "Pointer map
35d40 20 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65   page %d is refe
35d50 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20  renced", i);.   
35d60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
35d70 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
35d80 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20  is analysis did 
35d90 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e  not leave any un
35da0 72 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f  ref() pages.  */
35db0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
35dc0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69  Unused(pBt);.  i
35dd0 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74  f( nRef != sqlit
35de0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
35df0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
35e00 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
35e10 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a  sg(&sCheck, 0, .
35e20 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69        "Outstandi
35e30 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f  ng page count go
35e40 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  es from %d to %d
35e50 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61   during this ana
35e60 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52  lysis",.      nR
35e70 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ef, sqlite3Pager
35e80 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
35e90 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d  ager).    );.  }
35ea0 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70  ..  /* Clean  up
35eb0 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f   and report erro
35ec0 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  rs..  */.  sqlit
35ed0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
35ee0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
35ef0 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20  sCheck.anRef);. 
35f00 20 69 66 28 20 73 43 68 65 63 6b 2e 6d 61 6c 6c   if( sCheck.mall
35f10 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
35f20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 52  sqlite3StrAccumR
35f30 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65 72 72  eset(&sCheck.err
35f40 4d 73 67 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72  Msg);.    *pnErr
35f50 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 2b 31   = sCheck.nErr+1
35f60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
35f70 20 20 7d 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73    }.  *pnErr = s
35f80 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 69 66  Check.nErr;.  if
35f90 28 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d 30  ( sCheck.nErr==0
35fa0 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
35fb0 75 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e  umReset(&sCheck.
35fc0 65 72 72 4d 73 67 29 3b 0a 20 20 72 65 74 75 72  errMsg);.  retur
35fd0 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
35fe0 6d 46 69 6e 69 73 68 28 26 73 43 68 65 63 6b 2e  mFinish(&sCheck.
35ff0 65 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e 64 69  errMsg);.}.#endi
36000 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
36010 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
36020 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
36030 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
36040 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72  ame of the under
36050 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
36060 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ile..**.** The p
36070 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69 73  ager filename is
36080 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f   invariant as lo
36090 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ng as the pager 
360a0 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74  is.** open so it
360b0 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65   is safe to acce
360c0 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42  ss without the B
360d0 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a  tShared mutex..*
360e0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
360f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
36100 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  ename(Btree *p){
36110 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
36120 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
36130 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
36140 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d  PagerFilename(p-
36150 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
36160 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
36170 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  he pathname of t
36180 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
36190 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  t contains the d
361a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
361b0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64 69  .** The pager di
361c0 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73 20  rectory name is 
361d0 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
361e0 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
361f0 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
36200 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
36210 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
36220 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
36230 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
36240 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e  ite3BtreeGetDirn
36250 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
36260 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
36270 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
36280 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
36290 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42  gerDirname(p->pB
362a0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  t->pPager);.}../
362b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
362c0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
362d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
362e0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 20   this database. 
362f0 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61  The return.** va
36300 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74  lue of this rout
36310 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ine is the same 
36320 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
36330 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ether the journa
36340 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65  l file.** has be
36350 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f  en created or no
36360 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  t..**.** The pag
36370 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
36380 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74  ame is invariant
36390 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
363a0 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e  pager is.** open
363b0 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   so it is safe t
363c0 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74  o access without
363d0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75   the BtShared mu
363e0 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  tex..*/.const ch
363f0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
36400 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42  GetJournalname(B
36410 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
36420 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  rt( p->pBt->pPag
36430 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  er!=0 );.  retur
36440 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  n sqlite3PagerJo
36450 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74  urnalname(p->pBt
36460 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69  ->pPager);.}..#i
36470 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36480 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43  T_VACUUM./*.** C
36490 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  opy the complete
364a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46   content of pBtF
364b0 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20  rom into pBtTo. 
364c0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   A transaction.*
364d0 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  * must be active
364e0 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e   for both files.
364f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
36500 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79 20  of file pTo may 
36510 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68  be reduced by th
36520 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
36530 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
36540 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61  s wrong, the tra
36550 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20  nsaction on pTo 
36560 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
36570 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
36580 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61 73  sful, CommitPhas
36590 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63 61  eOne() may be ca
365a0 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66 6f  lled on pTo befo
365b0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a  re returning. .*
365c0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  * The caller sho
365d0 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d 69  uld finish commi
365e0 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  tting the transa
365f0 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79 20  ction on pTo by 
36600 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
36610 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e  e3BtreeCommit().
36620 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
36630 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72  treeCopyFile(Btr
36640 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a  ee *pTo, Btree *
36650 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63  pFrom){.  int rc
36660 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
36670 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f 20  Pgno i;..  Pgno 
36680 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20 2f  nFromPage;     /
36690 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
366a0 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20 20  s in pFrom */.  
366b0 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20 20  Pgno nToPage;   
366c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
366d0 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a 2f   pages in pTo */
366e0 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67 65  .  Pgno nNewPage
366f0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
36700 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f   of pages in pTo
36710 20 61 66 74 65 72 20 74 68 65 20 63 6f 70 79 20   after the copy 
36720 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69 70  */..  Pgno iSkip
36730 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 6e  ;         /* Pen
36740 64 69 6e 67 20 62 79 74 65 20 70 61 67 65 20 69  ding byte page i
36750 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  n pTo */.  int n
36760 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20 2f  ToPageSize;    /
36770 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70  * Page size of p
36780 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  To in bytes */. 
36790 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53 69   int nFromPageSi
367a0 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  ze;  /* Page siz
367b0 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62 79  e of pFrom in by
367c0 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61 72  tes */..  BtShar
367d0 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d  ed *pBtTo = pTo-
367e0 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64  >pBt;.  BtShared
367f0 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f   *pBtFrom = pFro
36800 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f 2d  m->pBt;.  pBtTo-
36810 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20  >db = pTo->db;. 
36820 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20 70   pBtFrom->db = p
36830 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f  From->db;..  nTo
36840 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54 6f  PageSize = pBtTo
36850 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e 46  ->pageSize;.  nF
36860 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70 42  romPageSize = pB
36870 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65 3b  tFrom->pageSize;
36880 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54  ..  if( pTo->inT
36890 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
368a0 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72  E || pFrom->inTr
368b0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
368c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
368d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
368e0 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43  .  if( pBtTo->pC
368f0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
36900 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
36910 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65 20  .  }..  nToPage 
36920 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
36930 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b  (pBtTo->pPager);
36940 0a 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d 20 70  .  nFromPage = p
36950 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
36960 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a  tFrom->pPager);.
36970 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e    iSkip = PENDIN
36980 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
36990 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  o);..  /* Variab
369a0 6c 65 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74  le nNewPage is t
369b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
369c0 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
369d0 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f  tore the.  ** co
369e0 6e 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20  ntents of pFrom 
369f0 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
36a00 74 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70  t page-size of p
36a10 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50  To..  */.  nNewP
36a20 61 67 65 20 3d 20 28 28 69 36 34 29 6e 46 72 6f  age = ((i64)nFro
36a30 6d 50 61 67 65 20 2a 20 28 69 36 34 29 6e 46 72  mPage * (i64)nFr
36a40 6f 6d 50 61 67 65 53 69 7a 65 20 2b 20 28 69 36  omPageSize + (i6
36a50 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20  4)nToPageSize - 
36a60 31 29 20 2f 20 0a 20 20 20 20 20 20 28 69 36 34  1) / .      (i64
36a70 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a 20  )nToPageSize;.. 
36a80 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
36a90 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e  LITE_OK && (i<=n
36aa0 54 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65  ToPage || i<=nNe
36ab0 77 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20  wPage); i++){.. 
36ac0 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68     /* Journal th
36ad0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2e  e original page.
36ae0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69  .    **.    ** i
36af0 53 6b 69 70 20 69 73 20 74 68 65 20 70 61 67 65  Skip is the page
36b00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
36b10 6f 63 6b 69 6e 67 20 70 61 67 65 20 28 50 45 4e  ocking page (PEN
36b20 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 29 0a  DING_BYTE_PAGE).
36b30 20 20 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61      ** in databa
36b40 73 65 20 2a 70 54 6f 20 28 62 65 66 6f 72 65 20  se *pTo (before 
36b50 74 68 65 20 63 6f 70 79 29 2e 20 54 68 69 73 20  the copy). This 
36b60 70 61 67 65 20 69 73 20 6e 65 76 65 72 20 77 72  page is never wr
36b70 69 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e  itten .    ** in
36b80 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
36b90 69 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69  ile. Unless i==i
36ba0 53 6b 69 70 20 6f 72 20 74 68 65 20 70 61 67 65  Skip or the page
36bb0 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   was not.    ** 
36bc0 70 72 65 73 65 6e 74 20 69 6e 20 70 54 6f 20 62  present in pTo b
36bd0 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  efore the copy o
36be0 70 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61  peration, journa
36bf0 6c 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 54  l page i from pT
36c00 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
36c10 28 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c  ( i!=iSkip && i<
36c20 3d 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20  =nToPage ){.    
36c30 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
36c40 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
36c50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
36c60 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  t(pBtTo->pPager,
36c70 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   i, &pDbPage);. 
36c80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36c90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36ca0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36cb0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
36cc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
36cd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
36ce0 69 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20  i>nFromPage ){. 
36cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 59 65 61 68           /* Yeah
36d00 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69 65 72  .  It seems wier
36d10 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72  d to call DontWr
36d20 69 74 65 28 29 20 72 69 67 68 74 20 61 66 74 65  ite() right afte
36d30 72 20 57 72 69 74 65 28 29 2e 20 42 75 74 0a 20  r Write(). But. 
36d40 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
36d50 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
36d60 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20 70  names of those p
36d70 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f 74  rocedures do not
36d80 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20 20 20   exactly .      
36d90 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
36da0 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20   what they do.  
36db0 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d  Write() really m
36dc0 65 61 6e 73 20 22 70 75 74 20 74 68 69 73 20 70  eans "put this p
36dd0 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  age in the.     
36de0 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
36df0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72   journal and mar
36e00 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f  k it as dirty so
36e10 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
36e20 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
36e30 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74     ** to the dat
36e40 61 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72  abase file later
36e50 2e 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20  ."  DontWrite() 
36e60 75 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e  undoes the secon
36e70 64 20 70 61 72 74 20 6f 66 0a 20 20 20 20 20 20  d part of.      
36e80 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20      ** that and 
36e90 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
36ea0 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
36eb0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
36ec0 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20 20 20  base. The.      
36ed0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73      ** page is s
36ee0 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  till on the roll
36ef0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
36f00 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20  ough.  And that 
36f10 69 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  is the .        
36f20 20 20 2a 2a 20 77 68 6f 6c 65 20 70 6f 69 6e 74    ** whole point
36f30 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b 3a 20   of this block: 
36f40 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e 20  to put pages on 
36f50 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
36f60 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 20 20 20  rnal. .         
36f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
36f80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 44   = sqlite3PagerD
36f90 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61 67 65  ontWrite(pDbPage
36fa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
36fb0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
36fc0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
36fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
36fe0 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
36ff0 20 74 68 65 20 64 61 74 61 20 69 6e 20 70 61 67   the data in pag
37000 65 20 69 20 6f 66 20 74 68 65 20 74 61 72 67 65  e i of the targe
37010 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
37020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37030 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b 69 70 20  _OK && i!=iSkip 
37040 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67 65 20 29  && i<=nNewPage )
37050 7b 0a 0a 20 20 20 20 20 20 44 62 50 61 67 65 20  {..      DbPage 
37060 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b 0a 20 20  *pToPage = 0;.  
37070 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
37080 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 72  4 iOff;..      r
37090 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
370a0 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  Get(pBtTo->pPage
370b0 72 2c 20 69 2c 20 26 70 54 6f 50 61 67 65 29 3b  r, i, &pToPage);
370c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
370d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
370e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
370f0 50 61 67 65 72 57 72 69 74 65 28 70 54 6f 50 61  PagerWrite(pToPa
37100 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ge);.      }..  
37110 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20      for(.       
37120 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e 54 6f 50   iOff=(i-1)*nToP
37130 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20  ageSize; .      
37140 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
37150 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f 50 61 67  && iOff<i*nToPag
37160 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20  eSize; .        
37170 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67  iOff += nFromPag
37180 65 53 69 7a 65 0a 20 20 20 20 20 20 29 7b 0a 20  eSize.      ){. 
37190 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
371a0 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20  FromPage = 0;.  
371b0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d        Pgno iFrom
371c0 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61   = (iOff/nFromPa
371d0 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20 20 20 20  geSize)+1;..    
371e0 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50      if( iFrom==P
371f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
37200 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a 20 20 20  (pBtFrom) ){.   
37210 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
37220 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
37230 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37240 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d  PagerGet(pBtFrom
37250 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c  ->pPager, iFrom,
37260 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20   &pFromPage);.  
37270 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37290 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 20 3d       char *zTo =
372a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
372b0 44 61 74 61 28 70 54 6f 50 61 67 65 29 3b 0a 20  Data(pToPage);. 
372c0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
372d0 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50 61  From = sqlite3Pa
372e0 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f 6d  gerGetData(pFrom
372f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
37300 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20 20 20   int nCopy;..   
37310 20 20 20 20 20 20 20 69 66 28 20 6e 46 72 6f 6d         if( nFrom
37320 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f 50 61 67  PageSize>=nToPag
37330 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
37340 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d 20 28 28       zFrom += ((
37350 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65  i-1)*nToPageSize
37360 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46   - ((iFrom-1)*nF
37370 72 6f 6d 50 61 67 65 53 69 7a 65 29 29 3b 0a 20  romPageSize));. 
37380 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79             nCopy
37390 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a   = nToPageSize;.
373a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
373b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
373c0 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d 31 29 2a   += (((iFrom-1)*
373d0 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 20 2d  nFromPageSize) -
373e0 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69   (i-1)*nToPageSi
373f0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ze);.           
37400 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f 6d 50 61   nCopy = nFromPa
37410 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
37420 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 6d    }..          m
37430 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46 72 6f 6d  emcpy(zTo, zFrom
37440 2c 20 6e 43 6f 70 79 29 3b 0a 09 20 20 73 71 6c  , nCopy);..  sql
37450 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
37460 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
37470 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
37480 20 20 20 20 69 66 28 20 70 54 6f 50 61 67 65 20      if( pToPage 
37490 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
374a0 67 65 20 2a 70 20 3d 20 28 4d 65 6d 50 61 67 65  ge *p = (MemPage
374b0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
374c0 65 74 45 78 74 72 61 28 70 54 6f 50 61 67 65 29  etExtra(pToPage)
374d0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 73 49  ;.        p->isI
374e0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nit = 0;.       
374f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37500 65 66 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20  ef(pToPage);.   
37510 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
37520 20 20 2f 2a 20 49 66 20 74 68 69 6e 67 73 20 68    /* If things h
37530 61 76 65 20 77 6f 72 6b 65 64 20 73 6f 20 66 61  ave worked so fa
37540 72 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  r, the database 
37550 66 69 6c 65 20 6d 61 79 20 6e 65 65 64 20 74 6f  file may need to
37560 20 62 65 20 0a 20 20 2a 2a 20 74 72 75 6e 63 61   be .  ** trunca
37570 74 65 64 2e 20 54 68 65 20 63 6f 6d 70 6c 65 78  ted. The complex
37580 20 70 61 72 74 20 69 73 20 74 68 61 74 20 69 74   part is that it
37590 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
375a0 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 20 20 2a  truncated to.  *
375b0 2a 20 61 20 73 69 7a 65 20 74 68 61 74 20 69 73  * a size that is
375c0 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
375d0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 6e 54 6f 50  multiple of nToP
375e0 61 67 65 53 69 7a 65 20 2d 20 74 68 65 20 63 75  ageSize - the cu
375f0 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20  rrent.  ** page 
37600 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
37610 20 70 61 67 65 72 20 61 73 73 6f 63 69 61 74 65   pager associate
37620 64 20 77 69 74 68 20 42 2d 54 72 65 65 20 70 54  d with B-Tree pT
37630 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  o..  **.  ** For
37640 20 65 78 61 6d 70 6c 65 2c 20 73 61 79 20 74 68   example, say th
37650 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70  e page-size of p
37660 54 6f 20 69 73 20 32 30 34 38 20 62 79 74 65 73  To is 2048 bytes
37670 20 61 6e 64 20 74 68 65 20 6f 72 69 67 69 6e 61   and the origina
37680 6c 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  l .  ** number o
37690 66 20 70 61 67 65 73 20 69 73 20 35 20 28 31 30  f pages is 5 (10
376a0 20 4b 42 20 66 69 6c 65 29 2e 20 49 66 20 70 46   KB file). If pF
376b0 72 6f 6d 20 68 61 73 20 61 20 70 61 67 65 20 73  rom has a page s
376c0 69 7a 65 20 6f 66 20 31 30 32 34 20 0a 20 20 2a  ize of 1024 .  *
376d0 2a 20 62 79 74 65 73 20 61 6e 64 20 39 20 70 61  * bytes and 9 pa
376e0 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ges, then the fi
376f0 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 74  le needs to be t
37700 72 75 6e 63 61 74 65 64 20 74 6f 20 39 4b 42 2e  runcated to 9KB.
37710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
37720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37730 20 69 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69   if( nFromPageSi
37740 7a 65 21 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20  ze!=nToPageSize 
37750 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
37760 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73  _file *pFile = s
37770 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
37780 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a  pBtTo->pPager);.
37790 20 20 20 20 20 20 69 36 34 20 69 53 69 7a 65 20        i64 iSize 
377a0 3d 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65  = (i64)nFromPage
377b0 53 69 7a 65 20 2a 20 28 69 36 34 29 6e 46 72 6f  Size * (i64)nFro
377c0 6d 50 61 67 65 3b 0a 20 20 20 20 20 20 69 36 34  mPage;.      i64
377d0 20 69 4e 6f 77 20 3d 20 28 69 36 34 29 28 28 6e   iNow = (i64)((n
377e0 54 6f 50 61 67 65 3e 6e 4e 65 77 50 61 67 65 29  ToPage>nNewPage)
377f0 3f 6e 54 6f 50 61 67 65 3a 6e 4e 65 77 50 61 67  ?nToPage:nNewPag
37800 65 29 20 2a 20 28 69 36 34 29 6e 54 6f 50 61 67  e) * (i64)nToPag
37810 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 69 36  eSize; .      i6
37820 34 20 69 50 65 6e 64 69 6e 67 20 3d 20 28 28 69  4 iPending = ((i
37830 36 34 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  64)PENDING_BYTE_
37840 50 41 47 45 28 70 42 74 54 6f 29 2d 31 29 20 2a  PAGE(pBtTo)-1) *
37850 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65  (i64)nToPageSize
37860 3b 0a 20 20 0a 20 20 20 20 20 20 61 73 73 65 72  ;.  .      asser
37870 74 28 20 69 53 69 7a 65 3c 3d 69 4e 6f 77 20 29  t( iSize<=iNow )
37880 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 6f  ;.  .      /* Co
37890 6d 6d 69 74 20 70 68 61 73 65 20 6f 6e 65 20 73  mmit phase one s
378a0 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
378b0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
378c0 20 77 69 74 68 20 70 54 6f 20 0a 20 20 20 20 20   with pTo .     
378d0 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
378e0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
378f0 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 73 79  . It does not sy
37900 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
37910 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 74  file.      ** it
37920 73 65 6c 66 2e 20 41 66 74 65 72 20 64 6f 69 6e  self. After doin
37930 67 20 74 68 69 73 20 69 74 20 69 73 20 73 61 66  g this it is saf
37940 65 20 74 6f 20 75 73 65 20 4f 73 54 72 75 6e 63  e to use OsTrunc
37950 61 74 65 28 29 20 61 6e 64 20 6f 74 68 65 72 0a  ate() and other.
37960 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 41 50        ** file AP
37970 49 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  Is on the databa
37980 73 65 20 66 69 6c 65 20 64 69 72 65 63 74 6c 79  se file directly
37990 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
379a0 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f   pBtTo->db = pTo
379b0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 72 63 20 3d  ->db;.      rc =
379c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
379d0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 54  mitPhaseOne(pBtT
379e0 6f 2d 3e 70 50 61 67 65 72 2c 20 30 2c 20 30 2c  o->pPager, 0, 0,
379f0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69   1);.      if( i
37a00 53 69 7a 65 3c 69 4e 6f 77 20 26 26 20 72 63 3d  Size<iNow && rc=
37a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37a20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37a30 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 46 69  e3OsTruncate(pFi
37a40 6c 65 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20 20  le, iSize);.    
37a50 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
37a60 54 68 65 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f  The loop that co
37a70 70 69 65 64 20 64 61 74 61 20 66 72 6f 6d 20 64  pied data from d
37a80 61 74 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f  atabase pFrom to
37a90 20 70 54 6f 20 64 69 64 20 6e 6f 74 0a 20 20 20   pTo did not.   
37aa0 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 74     ** populate t
37ab0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20  he locking page 
37ac0 6f 66 20 64 61 74 61 62 61 73 65 20 70 54 6f 2e  of database pTo.
37ad0 20 49 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   If the page-siz
37ae0 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 70 46  e of.      ** pF
37af0 72 6f 6d 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  rom is smaller t
37b00 68 61 6e 20 74 68 61 74 20 6f 66 20 70 54 6f 2c  han that of pTo,
37b10 20 74 68 69 73 20 6d 65 61 6e 73 20 73 6f 6d 65   this means some
37b20 20 64 61 74 61 20 77 69 6c 6c 0a 20 20 20 20 20   data will.     
37b30 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20 62 65 65   ** not have bee
37b40 6e 20 63 6f 70 69 65 64 2e 20 0a 20 20 20 20 20  n copied. .     
37b50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
37b60 73 20 62 6c 6f 63 6b 20 63 6f 70 69 65 73 20 74  s block copies t
37b70 68 65 20 6d 69 73 73 69 6e 67 20 64 61 74 61 20  he missing data 
37b80 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 70 46  from database pF
37b90 72 6f 6d 20 74 6f 20 70 54 6f 20 0a 20 20 20 20  rom to pTo .    
37ba0 20 20 2a 2a 20 75 73 69 6e 67 20 66 69 6c 65 20    ** using file 
37bb0 41 50 49 73 2e 20 54 68 69 73 20 69 73 20 73 61  APIs. This is sa
37bc0 66 65 20 62 65 63 61 75 73 65 20 61 74 20 74 68  fe because at th
37bd0 69 73 20 70 6f 69 6e 74 20 77 65 20 6b 6e 6f 77  is point we know
37be0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61   that.      ** a
37bf0 6c 6c 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ll of the origin
37c00 61 6c 20 64 61 74 61 20 66 72 6f 6d 20 70 54 6f  al data from pTo
37c10 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
37c20 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20   into the .     
37c30 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
37c40 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
37c50 69 74 20 77 6f 75 6c 64 20 62 65 20 73 61 66 65  it would be safe
37c60 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
37c70 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  at.      ** all 
37c80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
37c90 66 69 6c 65 20 65 78 63 65 70 74 20 74 72 75 6e  file except trun
37ca0 63 61 74 65 20 69 74 20 74 6f 20 7a 65 72 6f 20  cate it to zero 
37cb0 62 79 74 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  bytes..      */.
37cc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37cd0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d  LITE_OK && nFrom
37ce0 50 61 67 65 53 69 7a 65 3c 6e 54 6f 50 61 67 65  PageSize<nToPage
37cf0 53 69 7a 65 20 26 26 20 69 53 69 7a 65 3e 69 50  Size && iSize>iP
37d00 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 20  ending){.       
37d10 20 69 36 34 20 69 4f 66 66 3b 0a 20 20 20 20 20   i64 iOff;.     
37d20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20     for(.        
37d30 20 20 69 4f 66 66 3d 69 50 65 6e 64 69 6e 67 3b    iOff=iPending;
37d40 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d   .          rc==
37d50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66  SQLITE_OK && iOf
37d60 66 3c 28 69 50 65 6e 64 69 6e 67 2b 6e 54 6f 50  f<(iPending+nToP
37d70 61 67 65 53 69 7a 65 29 3b 20 0a 20 20 20 20 20  ageSize); .     
37d80 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72       iOff += nFr
37d90 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20  omPageSize.     
37da0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
37db0 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61 67  DbPage *pFromPag
37dc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
37dd0 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69   Pgno iFrom = (i
37de0 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a  Off/nFromPageSiz
37df0 65 29 2b 31 3b 0a 20 20 0a 20 20 20 20 20 20 20  e)+1;.  .       
37e00 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45     if( iFrom==PE
37e10 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
37e20 70 42 74 46 72 6f 6d 29 20 7c 7c 20 69 46 72 6f  pBtFrom) || iFro
37e30 6d 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20  m>nFromPage ){. 
37e40 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
37e50 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
37e60 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  .  .          rc
37e70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
37e80 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  et(pBtFrom->pPag
37e90 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f  er, iFrom, &pFro
37ea0 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
37eb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37ec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
37ed0 20 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d     char *zFrom =
37ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
37ef0 44 61 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b  Data(pFromPage);
37f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
37f10 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
37f20 28 70 46 69 6c 65 2c 20 7a 46 72 6f 6d 2c 20 6e  (pFile, zFrom, n
37f30 46 72 6f 6d 50 61 67 65 53 69 7a 65 2c 20 69 4f  FromPageSize, iO
37f40 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ff);.           
37f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37f60 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  ef(pFromPage);. 
37f70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
37f80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a     }.      }.  .
37f90 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68        /* Sync th
37fa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37fb0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
37fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37fd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37fe0 65 33 50 61 67 65 72 53 79 6e 63 28 70 42 74 54  e3PagerSync(pBtT
37ff0 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  o->pPager);.    
38000 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
38010 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
38020 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
38030 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 4e  BtTo->pPager, nN
38040 65 77 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ewPage);.    }. 
38050 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 42  E_OK ){.      pB
38070 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  tTo->pageSizeFix
38080 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ed = 0;.    }.  
38090 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  }..  if( rc ){. 
380a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
380b0 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20  ollback(pTo);.  
380c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  }..  return rc; 
380d0 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42   .}.int sqlite3B
380e0 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72  treeCopyFile(Btr
380f0 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a  ee *pTo, Btree *
38100 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63  pFrom){.  int rc
38110 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
38120 45 6e 74 65 72 28 70 54 6f 29 3b 0a 20 20 73 71  Enter(pTo);.  sq
38130 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
38140 70 46 72 6f 6d 29 3b 0a 20 20 72 63 20 3d 20 62  pFrom);.  rc = b
38150 74 72 65 65 43 6f 70 79 46 69 6c 65 28 70 54 6f  treeCopyFile(pTo
38160 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69  , pFrom);.  sqli
38170 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 46  te3BtreeLeave(pF
38180 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rom);.  sqlite3B
38190 74 72 65 65 4c 65 61 76 65 28 70 54 6f 29 3b 0a  treeLeave(pTo);.
381a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
381b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
381c0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a  _OMIT_VACUUM */.
381d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
381e0 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e  n-zero if a tran
381f0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
38200 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
38210 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
38220 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
38230 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c  ert( p==0 || sql
38240 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
38250 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
38260 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
38270 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
38280 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f  NS_WRITE));.}../
38290 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
382a0 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d  zero if a statem
382b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
382c0 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
382d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
382e0 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  InStmt(Btree *p)
382f0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
38300 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
38310 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72  ex(p) );.  retur
38320 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e  n (p->pBt && p->
38330 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a  pBt->inStmt);.}.
38340 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
38350 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65 61 64  n-zero if a read
38360 20 28 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e   (or write) tran
38370 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
38380 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
38390 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
383a0 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ans(Btree *p){. 
383b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
383c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
383d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
383e0 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
383f0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
38400 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ONE));.}../*.** 
38410 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
38420 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
38430 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d  to a blob of mem
38440 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
38450 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  ith.** a single 
38460 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54 68  shared-btree. Th
38470 65 20 6d 65 6d 6f 72 79 20 69