/ Hex Artifact Content
Login

Artifact dfbbfc396fdd8cbc29754864a97c4df484b78870:


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 36 33 20 32 30 30 39 2f 30  c,v 1.563 2009/0
0190: 31 2f 33 31 20 31 34 3a 35 34 3a 30 37 20 64 61  1/31 14:54:07 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 65 74 20 62 69 74 20 70 67 6e  *.** Set bit pgn
1f70: 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65  o of the BtShare
1f80: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
1f90: 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63 61  tvec. This is ca
1fa0: 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20  lled .** when a 
1fb0: 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69 6f  page that previo
1fc0: 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64  usly contained d
1fd0: 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72  ata becomes a fr
1fe0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a  ee-list leaf .**
1ff0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
2000: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
2010: 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78 69  ntent bitvec exi
2020: 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  sts to work arou
2030: 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a  nd an obscure.**
2040: 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20 74   bug caused by t
2050: 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f  he interaction o
2060: 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20  f two useful IO 
2070: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75  optimizations su
2080: 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65  rrounding.** fre
2090: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
20a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68  s:.**.**   1) Wh
20b0: 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64  en all data is d
20c0: 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61  eleted from a pa
20d0: 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ge and the page 
20e0: 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20  becomes.**      
20f0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
2100: 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65 20   page, the page 
2110: 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  is not written t
2120: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
2130: 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65 2d  *      (as free-
2140: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20  list leaf pages 
2150: 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69  contain no meani
2160: 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d  ngful data). Som
2170: 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73  etimes.**      s
2180: 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f  uch a page is no
2190: 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65  t even journalle
21a0: 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f  d (as it will no
21b0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a  t be modified,.*
21c0: 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68 65  *      why bothe
21d0: 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74  r journalling it
21e0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57  ?)..**.**   2) W
21f0: 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20  hen a free-list 
2200: 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65 75  leaf page is reu
2210: 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  sed, its content
2220: 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20   is not read.** 
2230: 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61       from the da
2240: 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74 65  tabase or writte
2250: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2260: 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c   file (why shoul
2270: 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c  d it.**      be,
2280: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74   if it is not at
2290: 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f   all meaningful?
22a0: 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d  )..**.** By them
22b0: 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70  selves, these op
22c0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b  timizations work
22d0: 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64   fine and provid
22e0: 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72  e a handy.** per
22f0: 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74  formance boost t
2300: 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72  o bulk delete or
2310: 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f   insert operatio
2320: 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a  ns. However, if.
2330: 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  ** a page is mov
2340: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
2350: 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75  ist and then reu
2360: 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 73  sed within the s
2370: 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ame.** transacti
2380: 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f  on, a problem co
2390: 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20 70  mes up. If the p
23a0: 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e  age is not journ
23b0: 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74  alled when.** it
23c0: 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   is moved to the
23d0: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69   free-list and i
23e0: 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f  t is also not jo
23f0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  urnalled when it
2400: 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65 64  .** is extracted
2410: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
2420: 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20  ist and reused, 
2430: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
2440: 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65  l data.** may be
2450: 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76   lost. In the ev
2460: 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
2470: 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65  k, it may not be
2480: 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20   possible.** to 
2490: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
24a0: 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
24b0: 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  inal configurati
24c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f  on..**.** The so
24d0: 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74  lution is the Bt
24e0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
24f0: 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  nt bitvec. Whene
2500: 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a  ver a page is .*
2510: 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d  * moved to becom
2520: 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  e a free-list le
2530: 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72  af page, the cor
2540: 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
2550: 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20  s.** set in the 
2560: 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72  bitvec. Whenever
2570: 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73 20   a leaf page is 
2580: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
2590: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a  he free-list,.**
25a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20   optimization 2 
25b0: 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74 65  above is ommitte
25c0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
25d0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
25e0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
25f0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
2600: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
2610: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
2620: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
2630: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
2640: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
2650: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2660: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
2670: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
2680: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
2690: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26a0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
26b0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
26c0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20    int nPage;.   
26d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26e0: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
26f0: 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
2700: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2710: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2720: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
2730: 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  t = sqlite3Bitve
2740: 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50 61  cCreate((u32)nPa
2750: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ge);.      if( !
2760: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
2770: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2780: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2790: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27b0: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
27c0: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
27d0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
27e0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
27f0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
2800: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
2810: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
2820: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2830: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
2840: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
2850: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
2860: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2870: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
2880: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2890: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
28a0: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
28b0: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
28c0: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
28d0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
28e0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
28f0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
2900: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
2910: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
2920: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
2930: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
2940: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
2950: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
2960: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
2970: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
2980: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
2990: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
29a0: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
29b0: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
29c0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
29d0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
29e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
29f0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
2a00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
2a10: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
2a20: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
2a30: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
2a40: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
2a50: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
2a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a70: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
2a80: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
2a90: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
2aa0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
2ab0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
2ac0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
2ad0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
2ae0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
2af0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2b00: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
2b10: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
2b20: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
2b30: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
2b40: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
2b50: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
2b60: 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74  IRESEEK..*/.stat
2b70: 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f  ic int saveCurso
2b80: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
2b90: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
2ba0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2bb0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
2bc0: 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20  ur->eState );.  
2bd0: 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d  assert( 0==pCur-
2be0: 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  >pKey );.  asser
2bf0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2c00: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
2c10: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2c20: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
2c30: 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20  pCur->nKey);..  
2c40: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2c50: 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74   intKey table, t
2c60: 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61  hen the above ca
2c70: 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69  ll to BtreeKeySi
2c80: 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  ze().  ** stores
2c90: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
2ca0: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20   in pCur->nKey. 
2cb0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
2cc0: 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20  s value is.  ** 
2cd0: 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
2ce0: 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ired. Otherwise,
2cf0: 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20   if pCur is not 
2d00: 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65  open on an intKe
2d10: 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68  y.  ** table, th
2d20: 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20  en malloc space 
2d30: 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  for and store th
2d40: 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74  e pCur->nKey byt
2d50: 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20  es of key .  ** 
2d60: 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  data..  */.  if(
2d70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d80: 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  & 0==pCur->apPag
2d90: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20  e[0]->intKey){. 
2da0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
2db0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28  sqlite3Malloc( (
2dc0: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29  int)pCur->nKey )
2dd0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
2de0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2df0: 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75  ite3BtreeKey(pCu
2e00: 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d  r, 0, (int)pCur-
2e10: 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20  >nKey, pKey);.  
2e20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e40: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b   pCur->pKey = pK
2e50: 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
2e60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e70: 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  _free(pKey);.   
2e80: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2e90: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ea0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2eb0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43   }.  assert( !pC
2ec0: 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2ed0: 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e  ntKey || !pCur->
2ee0: 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72  pKey );..  if( r
2ef0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f00: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
2f10: 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
2f20: 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
2f30: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f40: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
2f50: 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 70  ;.      pCur->ap
2f60: 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
2f70: 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
2f80: 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75  ge = -1;.    pCu
2f90: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2fa0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
2fb0: 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74    }..  invalidat
2fc0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
2fd0: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
2fe0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
2ff0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
3000: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78  f all cursors ex
3010: 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70 65  cept pExcept ope
3020: 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a  n on the table .
3030: 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  ** with root-pag
3040: 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79  e iRoot. Usually
3050: 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  , this is called
3060: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
3070: 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69  sor.** pExcept i
3080: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
3090: 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65   the table (Btre
30a0: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
30b0: 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a  eeInsert())..*/.
30c0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
30d0: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
30e0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
30f0: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
3100: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
3110: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
3120: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3130: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3140: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
3150: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
3160: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
3170: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
3180: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
3190: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
31a0: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
31b0: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
31c0: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
31d0: 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74   .        p->eSt
31e0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
31f0: 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
3200: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
3210: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
3220: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
3230: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
3240: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
3250: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3260: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3270: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
3280: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
3290: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
32a0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
32b0: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
32c0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
32d0: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
32e0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
32f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3300: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
3310: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
3320: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
3330: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
3340: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
3350: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
3360: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
3370: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
3380: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
3390: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
33a0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
33b0: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
33c0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
33d0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
33e0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
33f0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
3400: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
3410: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
3420: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
3430: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
3440: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
3450: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
3460: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
3470: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
3480: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
3490: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
34a0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
34b0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
34c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
34d0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
34e0: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
34f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
3500: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
3510: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
3520: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
3530: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
3540: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
3550: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
3560: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3570: 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ID;.  rc = sqlit
3580: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
3590: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
35a0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
35b0: 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69  pCur->skip);.  i
35c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
35e0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
35f0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
3600: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
3610: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
3620: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
3630: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
3640: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
3650: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3660: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
3670: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
3680: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
3690: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
36a0: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
36b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
36c0: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
36d0: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
36e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
36f0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
3700: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
3710: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
3720: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
3730: 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73  sition it.** was
3740: 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e   last placed at.
3750: 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f    Cursors can mo
3760: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
3770: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
3780: 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74  g.** at is delet
3790: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
37a0: 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r them..**.** Th
37b0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
37c0: 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ns an error code
37d0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
37e0: 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a  es wrong.  The.*
37f0: 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d  * integer *pHasM
3800: 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f  oved is set to o
3810: 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ne if the cursor
3820: 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30   has moved and 0
3830: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20   if not..*/.int 
3840: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
3850: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
3860: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
3870: 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e  pHasMoved){.  in
3880: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  t rc;..  rc = re
3890: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
38a0: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
38b0: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73   rc ){.    *pHas
38c0: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  Moved = 1;.    r
38d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
38e0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
38f0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
3900: 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30 20  | pCur->skip!=0 
3910: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
3920: 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
3930: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
3940: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
3950: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
3960: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3970: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
3980: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
3990: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
39a0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
39b0: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
39c0: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
39d0: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
39e0: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
39f0: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
3a00: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
3a10: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
3a20: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
3a30: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
3a40: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
3a50: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
3a60: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
3a70: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
3a80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3a90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3aa0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
3ab0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
3ac0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
3ad0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
3ae0: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
3af0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
3b00: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
3b10: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
3b20: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
3b30: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
3b40: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
3b50: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
3b60: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
3b70: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
3b80: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
3b90: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
3ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
3bb0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
3bc0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
3bd0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
3be0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
3bf0: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
3c00: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
3c10: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
3c20: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
3c30: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
3c40: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
3c50: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
3c60: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
3c70: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
3c80: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
3c90: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
3ca0: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
3cb0: 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  ent){.  DbPage *
3cc0: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
3cd0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
3ce0: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
3cf0: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
3d00: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
3d10: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
3d20: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
3d30: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3d40: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
3d50: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
3d60: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
3d70: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
3d80: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
3d90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3da0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3db0: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
3dc0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
3dd0: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
3de0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
3df0: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
3e00: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
3e10: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
3e20: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
3e30: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
3e40: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
3e50: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
3e60: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
3e70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3e80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
3e90: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
3ea0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
3eb0: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
3ec0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
3ed0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
3ee0: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
3ef0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3f00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
3f10: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  n rc;.  }.  offs
3f20: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
3f30: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
3f40: 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  ey);.  pPtrmap =
3f50: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
3f60: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
3f70: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
3f80: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
3f90: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
3fa0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
3fb0: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
3fc0: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
3fd0: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
3fe0: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
3ff0: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
4000: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
4010: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
4020: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
4030: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4040: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
4050: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
4060: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
4070: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
4080: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
4090: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  }..  sqlite3Page
40a0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
40b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
40c0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
40d0: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
40e0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
40f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
4100: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
4110: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
4120: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
4130: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
4140: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
4150: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
4160: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
4170: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
4180: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
4190: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
41a0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
41b0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
41c0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
41d0: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
41e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
41f0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
4200: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
4210: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
4220: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
4230: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
4240: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
4250: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
4260: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
4270: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
4280: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
4290: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
42a0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
42b0: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
42c0: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
42d0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
42e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
42f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4300: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
4310: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
4320: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
4330: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
4340: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
4350: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
4360: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
4370: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
4380: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
4390: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
43a0: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
43b0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
43c0: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
43d0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
43e0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
43f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
4400: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
4410: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
4420: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
4430: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
4440: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
4450: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
4460: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
4470: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
4480: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
4490: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
44a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
44b0: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
44c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
44d0: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
44e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
44f0: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
4500: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
4510: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
4520: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
4530: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
4540: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
4550: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
4560: 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  (y,z) SQLITE_OK.
4570: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
4580: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
4590: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
45a0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
45b0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
45c0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
45d0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
45e0: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
45f0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
4600: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
4610: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
4620: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
4630: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
4640: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
4650: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
4660: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
4670: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
4680: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
4690: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
46a0: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
46b0: 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c  >aData[(P)->cell
46c0: 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29  Offset+2*(I)])))
46d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
46e0: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
46f0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
4700: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
4710: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
4720: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
4730: 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69  ow cells.  See i
4740: 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20  nsert.*/.static 
4750: 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77  u8 *findOverflow
4760: 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
4770: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
4780: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
4790: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
47a0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
47b0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
47c0: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
47d0: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
47e0: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
47f0: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
4800: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
4810: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
4820: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
4830: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
4840: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
4850: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
4860: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
4870: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
4880: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
4890: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
48a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
48b0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
48c0: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
48d0: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
48e0: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
48f0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
4900: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
4910: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
4920: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
4930: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71  is function.  sq
4940: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4950: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
4960: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
4970: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4980: 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42  ent and sqlite3B
4990: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
49a0: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
49b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
49c0: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
49d0: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
49e0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
49f0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
4a00: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
4a10: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
4a20: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
4a30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4a40: 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69  seCellPtr(). Usi
4a50: 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  ng some compiler
4a60: 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
4a70: 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  faster..*/.void 
4a80: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
4a90: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
4aa0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
4ab0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
4ac0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
4ad0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4af0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
4b00: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
4b10: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
4b20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
4b30: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
4b40: 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20   */.){.  u16 n; 
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b60: 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73   /* Number bytes
4b70: 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   in cell content
4b80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
4b90: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
4ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4bb0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
4bc0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
4bd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4be0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
4bf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
4c00: 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d    pInfo->pCell =
4c10: 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74   pCell;.  assert
4c20: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
4c30: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
4c40: 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67  =1 );.  n = pPag
4c50: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
4c60: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d  .  assert( n==4-
4c70: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
4c80: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
4c90: 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20  tKey ){.    if( 
4ca0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
4cb0: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74  {.      n += get
4cc0: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
4cd0: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
4ce0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4cf0: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
4d00: 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74    }.    n += get
4d10: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
4d20: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
4d30: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
4d40: 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f  ->nData = nPaylo
4d50: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
4d60: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
4d70: 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  0;.    n += getV
4d80: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
4d90: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
4da0: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
4db0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20  nPayload;.  }.  
4dc0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
4dd0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
4de0: 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e  nfo->nHeader = n
4df0: 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e  ;.  if( likely(n
4e00: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
4e10: 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  maxLocal) ){.   
4e20: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
4e30: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
4e40: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
4e50: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
4e60: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
4e70: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
4e80: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
4e90: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
4ea0: 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  int nSize;      
4eb0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
4ec0: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
4ed0: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
4ee0: 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f    nSize = nPaylo
4ef0: 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66  ad + n;.    pInf
4f00: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
4f10: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70  )nPayload;.    p
4f20: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
4f30: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53  = 0;.    if( (nS
4f40: 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a  ize & ~3)==0 ){.
4f50: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b        nSize = 4;
4f60: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
4f70: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
4f80: 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70  4 */.    }.    p
4f90: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75  Info->nSize = (u
4fa0: 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73  16)nSize;.  }els
4fb0: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
4fc0: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
4fd0: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
4fe0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
4ff0: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20  ge, we have.    
5000: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
5010: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
5020: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
5030: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
5040: 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  o.    ** overflo
5050: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
5060: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
5070: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
5080: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a   of unused.    *
5090: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
50a0: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
50b0: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
50c0: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
50d0: 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65  age.    ** in be
50e0: 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61  tween minLocal a
50f0: 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20  nd maxLocal..   
5100: 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69   **.    ** Warni
5110: 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68  ng:  changing th
5120: 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70  e way overflow p
5130: 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69  ayload is distri
5140: 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20  buted in any.   
5150: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
5160: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
5170: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
5180: 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  at..    */.    i
5190: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
51a0: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
51b0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
51c0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
51d0: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
51e0: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
51f0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
5200: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69  locally */.    i
5210: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
5220: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
5230: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
5240: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
5250: 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  ..    minLocal =
5260: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
5270: 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  ;.    maxLocal =
5280: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
5290: 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20  ;.    surplus = 
52a0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79  minLocal + (nPay
52b0: 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  load - minLocal)
52c0: 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  %(pPage->pBt->us
52d0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
52e0: 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c     if( surplus <
52f0: 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  = maxLocal ){.  
5300: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
5310: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
5320: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5330: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
5340: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
5350: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66  ;.    }.    pInf
5360: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  o->iOverflow = (
5370: 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  u16)(pInfo->nLoc
5380: 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e  al + n);.    pIn
5390: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
53a0: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
53b0: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
53c0: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
53d0: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c   iCell, pInfo) \
53e0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
53f0: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
5400: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
5410: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
5420: 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73   (pInfo)).void s
5430: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
5440: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
5450: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
5460: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
5470: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
5480: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
5490: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
54a0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
54b0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
54c0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
54d0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
54e0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
54f0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
5500: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
5510: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
5520: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
5530: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
5540: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
5550: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
5560: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
5570: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
5580: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
5590: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
55a0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
55b0: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
55c0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
55d0: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
55e0: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
55f0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
5600: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
5610: 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  er..*/.#ifndef N
5620: 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36  DEBUG.static u16
5630: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
5640: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
5650: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
5660: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
5670: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
5680: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e  Page, iCell, &in
5690: 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  fo);.  return in
56a0: 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  fo.nSize;.}.#end
56b0: 69 66 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  if.static u16 ce
56c0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
56d0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
56e0: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
56f0: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
5700: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
5710: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
5720: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
5730: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a   info.nSize;.}..
5740: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5750: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
5760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
5770: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
5780: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
5790: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
57a0: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
57b0: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
57c0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
57d0: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
57e0: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
57f0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
5800: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
5810: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
5820: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
5830: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
5840: 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
5850: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
5860: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
5870: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
5880: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
5890: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
58a0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
58b0: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
58c0: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
58d0: 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  f( (info.nData+(
58e0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
58f0: 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f  info.nKey))>info
5900: 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 50  .nLocal ){.    P
5910: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
5920: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
5930: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
5940: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
5950: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
5960: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
5970: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
5980: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
5990: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
59a0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
59b0: 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c  with index iCell
59c0: 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20 63   on page pPage c
59d0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
59e0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
59f0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
5a00: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
5a10: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
5a20: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
5a30: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
5a40: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
5a50: 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Ovfl(MemPage *pP
5a60: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
5a70: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
5a80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5a90: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
5aa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
5ab0: 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f  .  pCell = findO
5ac0: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
5ad0: 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e, iCell);.  ret
5ae0: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
5af0: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
5b00: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  l);.}.#endif.../
5b10: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
5b20: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
5b30: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
5b40: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
5b50: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
5b60: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
5b70: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
5b80: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
5b90: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
5ba0: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
5bb0: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
5bc0: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
5bd0: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
5be0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
5bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
5c00: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
5c10: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
5c20: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
5c40: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
5c50: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
5c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
5c70: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
5c80: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ll */.  int addr
5c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ca0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
5cb0: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
5cc0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
5cd0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ray */.  int hdr
5ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5cf0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
5d00: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
5d10: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
5d40: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
5d50: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
5d60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5d70: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
5d80: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
5d90: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
5da0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
5db0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
5dc0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
5dd0: 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20  int cbrk;       
5de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
5df0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
5e00: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
5e10: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5e30: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
5e40: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
5e50: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5e60: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
5e70: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
5e80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5e90: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
5ea0: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
5eb0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  ell content */..
5ec0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5ed0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
5ee0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
5ef0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5f00: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
5f10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5f20: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
5f30: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
5f40: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
5f50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
5f60: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
5f70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5f80: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
5f90: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
5fa0: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
5fb0: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
5fc0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
5fd0: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
5fe0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
5ff0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
6000: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
6010: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
6020: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
6030: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
6040: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
6050: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
6060: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
6070: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
6080: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
6090: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
60a0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
60b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
60c0: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
60d0: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
60e0: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
60f0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
6100: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
6110: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
6120: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
6130: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
6140: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
6150: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
6160: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
6170: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
6180: 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70 63  ddr);.    if( pc
6190: 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  >=usableSize ){.
61a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
61b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
61c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69 7a 65  ;.    }.    size
61d0: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
61e0: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
61f0: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
6200: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
6210: 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  <cellOffset+2*nC
6220: 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  ell || pc+size>u
6230: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
6240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6250: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6260: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
6270: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
6280: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
6290: 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  0 );.    memcpy(
62a0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
62b0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
62c0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
62d0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
62e0: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63 65  assert( cbrk>=ce
62f0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
6300: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
6310: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
6320: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
6330: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
6340: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
6350: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61  [hdr+7] = 0;.  a
6360: 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ddr = cellOffset
6370: 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73  +2*nCell;.  mems
6380: 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  et(&data[addr], 
6390: 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a 20  0, cbrk-addr);. 
63a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
63b0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
63c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
63d0: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 61   );.  if( cbrk-a
63e0: 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ddr!=pPage->nFre
63f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
6400: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6410: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
6420: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6430: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
6440: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
6450: 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a  ace on a page..*
6460: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6470: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
6480: 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65  ->aData[] of the
6490: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 2a   first byte of.*
64a0: 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  * the new alloca
64b0: 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c 6c 65  tion.  The calle
64c0: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
64d0: 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
64e0: 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20 54 68 69  h.** space.  Thi
64f0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  s routine will n
6500: 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  ever fail..**.**
6510: 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   If the page con
6520: 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66 20  tains nBytes of 
6530: 66 72 65 65 20 73 70 61 63 65 20 62 75 74 20 64  free space but d
6540: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a  oes not contain.
6550: 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e  ** nBytes of con
6560: 74 69 67 75 6f 75 73 20 66 72 65 65 20 73 70 61  tiguous free spa
6570: 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ce, then this ro
6580: 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63 61  utine automatica
6590: 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66  lly.** calls def
65a0: 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20 74  ragementPage() t
65b0: 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c  o consolidate al
65c0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 62 65 66  l free space bef
65d0: 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  ore .** allocati
65e0: 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e 6b  ng the new chunk
65f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6600: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
6610: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
6620: 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  t nByte){.  int 
6630: 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20  addr, pc, hdr;. 
6640: 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74   int size;.  int
6650: 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f   nFrag;.  int to
6660: 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  p;.  int nCell;.
6670: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
6680: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
6690: 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64 61  r *data;.  .  da
66a0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
66b0: 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  a;.  assert( sql
66c0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
66d0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
66e0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
66f0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
6700: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6710: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6720: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6730: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
6740: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
6750: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
6760: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
6770: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
6780: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
6790: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
67a0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ow==0 );.  pPage
67b0: 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
67c0: 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70  nByte;.  hdr = p
67d0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
67e0: 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61  ..  nFrag = data
67f0: 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e  [hdr+7];.  if( n
6800: 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f  Frag<60 ){.    /
6810: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65  * Search the fre
6820: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
6830: 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  r a slot big eno
6840: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
6850: 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  he.    ** space 
6860: 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20  request. */.    
6870: 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20  addr = hdr+1;.  
6880: 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67    while( (pc = g
6890: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
68a0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20  dr]))>0 ){.     
68b0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
68c0: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
68d0: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e       if( size>=n
68e0: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
68f0: 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e  int x = size - n
6900: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Byte;.        if
6910: 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29  ( size<nByte+4 )
6920: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
6930: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
6940: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
6950: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
6960: 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61  r+7] = (u8)(nFra
6970: 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20  g + x);.        
6980: 20 20 72 65 74 75 72 6e 20 70 63 3b 0a 20 20 20    return pc;.   
6990: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
69a0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
69b0: 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  data[pc+2], x);.
69c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
69d0: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
69e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
69f0: 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20   addr = pc;.    
6a00: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
6a10: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
6a20: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
6a30: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
6a40: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
6a50: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
6a60: 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a  tent area..  */.
6a70: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
6a80: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
6a90: 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
6aa0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
6ab0: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
6ac0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
6ad0: 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  et;.  if( nFrag>
6ae0: 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65  =60 || cellOffse
6af0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f  t + 2*nCell > to
6b00: 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  p - nByte ){.   
6b10: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
6b20: 70 50 61 67 65 29 3b 0a 20 20 20 20 74 6f 70 20  pPage);.    top 
6b30: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6b40: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20  [hdr+5]);.  }.  
6b50: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
6b60: 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73  assert( cellOffs
6b70: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20  et + 2*nCell <= 
6b80: 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74  top );.  put2byt
6b90: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
6ba0: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
6bb0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
6bc0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
6bd0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
6be0: 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn top;.}../*.*
6bf0: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
6c00: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
6c10: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
6c20: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
6c30: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
6c40: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
6c50: 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b  is pPage->aDisk[
6c60: 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  start].** and th
6c70: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
6c80: 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79  ock is "size" by
6c90: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  tes..**.** Most 
6ca0: 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65  of the effort he
6cb0: 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  re is involved i
6cc0: 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61  n coalesing adja
6cd0: 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f  cent.** free blo
6ce0: 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  cks into a singl
6cf0: 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b  e big free block
6d00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6d10: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
6d20: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
6d30: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
6d40: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
6d50: 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69 67  in, hdr;.  unsig
6d60: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
6d70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
6d80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
6d90: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
6da0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
6db0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
6dc0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
6dd0: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
6de0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
6df0: 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  t+6+(pPage->leaf
6e00: 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72  ?0:4) );.  asser
6e10: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
6e20: 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )<=pPage->pBt->u
6e30: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
6e40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6e50: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6e60: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6e70: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d    assert( size>=
6e80: 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  0 );   /* Minimu
6e90: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
6ea0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
6eb0: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
6ec0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
6ed0: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
6ee0: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
6ef0: 68 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44  hen the SECURE_D
6f00: 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69  ELETE .  ** opti
6f10: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74  on is enabled at
6f20: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f   compile-time */
6f30: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
6f40: 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29  start], 0, size)
6f50: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
6f60: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
6f70: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
6f80: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
6f90: 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20  ocks */.  hdr = 
6fa0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6fb0: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
6fc0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
6fd0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
6fe0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
6ff0: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
7000: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7010: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
7020: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
7030: 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  );.    if( pbegi
7040: 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20 20 20  n<=addr ) {.    
7050: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7060: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7070: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
7080: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 20  begin;.  }.  if 
7090: 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65 2d 3e  ( pbegin>pPage->
70a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
70b0: 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  4 ) {.    return
70c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
70d0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
70e0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
70f0: 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a  || pbegin==0 );.
7100: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
7110: 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a  [addr], start);.
7120: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
7130: 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29  [start], pbegin)
7140: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
7150: 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a  ta[start+2], siz
7160: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
7170: 65 65 20 2b 3d 20 28 75 31 36 29 73 69 7a 65 3b  ee += (u16)size;
7180: 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20  ..  /* Coalesce 
7190: 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c  adjacent free bl
71a0: 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d  ocks */.  addr =
71b0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
71c0: 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  t + 1;.  while( 
71d0: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
71e0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
71f0: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e  >0 ){.    int pn
7200: 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20  ext, psize, x;. 
7210: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
7220: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73  n>addr );.    as
7230: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
7240: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
7250: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e  Size-4 );.    pn
7260: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
7270: 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20  data[pbegin]);. 
7280: 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62     psize = get2b
7290: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
72a0: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62  +2]);.    if( pb
72b0: 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33  egin + psize + 3
72c0: 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65   >= pnext && pne
72d0: 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  xt>0 ){.      in
72e0: 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d  t frag = pnext -
72f0: 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b   (pbegin+psize);
7300: 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67  .      if( (frag
7310: 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e  <0) || (frag>(in
7320: 74 29 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  t)data[pPage->hd
7330: 72 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b 0a 20  rOffset+7]) ){. 
7340: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
7350: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7360: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
7370: 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72   data[pPage->hdr
7380: 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28 75 38  Offset+7] -= (u8
7390: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
73a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
73b0: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
73c0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
73d0: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
73e0: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
73f0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
7400: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
7410: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
7420: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
7430: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
7440: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
7450: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
7460: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
7470: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
7480: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
7490: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
74a0: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
74b0: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
74c0: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
74d0: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
74e0: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
74f0: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
7500: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
7510: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
7520: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
7530: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
7540: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
7550: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
7560: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
7570: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
7580: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
7590: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
75a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
75b0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
75c0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
75d0: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
75e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
75f0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
7600: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
7610: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
7620: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
7630: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
7640: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
7650: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
7660: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
7670: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
7680: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
7690: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
76a0: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
76b0: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
76c0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
76d0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
76e0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
76f0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
7700: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
7710: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
7720: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
7730: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
7740: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
7750: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
7760: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
7770: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
7780: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
7790: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
77a0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
77b0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
77c0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
77d0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
77e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
77f0: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
7800: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
7810: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
7820: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7830: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7840: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7850: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
7860: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
7870: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
7880: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
7890: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
78a0: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
78b0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
78c0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
78d0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
78e0: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
78f0: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
7900: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
7910: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
7920: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
7930: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
7940: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
7950: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
7960: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
7970: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
7980: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
7990: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
79a0: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
79b0: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
79c0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
79d0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
79e0: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
79f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
7a00: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
7a10: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
7a20: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
7a30: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
7a40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7a50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
7a60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7a70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
7a80: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
7a90: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
7aa0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
7ab0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
7ac0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
7ad0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
7ae0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
7af0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
7b00: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
7b10: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
7b20: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
7b30: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
7b40: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
7b50: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
7b60: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
7b70: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
7b80: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
7b90: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
7ba0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
7bb0: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
7bc0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
7bd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7be0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
7bf0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
7c00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7c10: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
7c20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7c30: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
7c40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
7c50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
7c60: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
7c70: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
7c80: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7c90: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
7ca0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7cb0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
7cc0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
7cd0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
7ce0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
7cf0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
7d00: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
7d10: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
7d20: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
7d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
7d40: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
7d50: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
7d60: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
7d70: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
7d80: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
7d90: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
7da0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
7db0: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
7dc0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
7dd0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
7de0: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
7df0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
7e00: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
7e10: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36  cture */.    u16
7e20: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
7e30: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
7e40: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
7e50: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
7e60: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
7e70: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
7e80: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
7e90: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
7ea0: 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e  ter */.    u16 n
7eb0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
7ec0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
7ed0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
7ee0: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74  age */.    u16 t
7ef0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
7f00: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
7f10: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
7f20: 61 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74  area */..    pBt
7f30: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
7f40: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
7f50: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
7f60: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
7f70: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63  ata;.    if( dec
7f80: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
7f90: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
7fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7fb0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
7fc0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
7fd0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
7fe0: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
7ff0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
8000: 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61  skPage = pBt->pa
8010: 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20  geSize - 1;.    
8020: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8030: 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
8040: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
8050: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
8060: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
8070: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
8080: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
8090: 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d  >leaf;.    top =
80a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
80b0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
80c0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
80d0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
80e0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
80f0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
8100: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
8110: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
8120: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
8130: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
8140: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
8150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8160: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8170: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
8180: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
8190: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
81a0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
81b0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
81c0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
81d0: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
81e0: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28  hdr+7] + top - (
81f0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
8200: 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
8210: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
8220: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
8230: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
8240: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
8250: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
8260: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
8270: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
8280: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8290: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
82a0: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
82b0: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
82c0: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
82d0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
82e0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
82f0: 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30        if( next>0
8300: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
8310: 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e+3 ){.        /
8320: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
8330: 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69  st be in accendi
8340: 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ng order */.    
8350: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8360: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
8370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
8380: 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20  Free += size;.  
8390: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
83a0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
83b0: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 6e 46 72  nFree = (u16)nFr
83c0: 65 65 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ee;.    if( nFre
83d0: 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  e>=usableSize ){
83e0: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 73  .      /* Free s
83f0: 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65  pace cannot exce
8400: 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69  ed total page si
8410: 7a 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ze */.      retu
8420: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8430: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 0a  T_BKPT; .    }..
8440: 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b  #if 0.  /* Check
8450: 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66   that all the of
8460: 66 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c  fsets in the cel
8470: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61  l offset array a
8480: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
8490: 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69   .  ** .  ** Omi
84a0: 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69  tting this consi
84b0: 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64  stency check and
84c0: 20 75 73 69 6e 67 20 74 68 65 20 70 50 61 67 65   using the pPage
84d0: 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a  ->maskPage mask.
84e0: 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20    ** to prevent 
84f0: 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20  overrunning the 
8500: 70 61 67 65 20 62 75 66 66 65 72 20 69 6e 20 66  page buffer in f
8510: 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74  indCell() result
8520: 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25  s in a.  ** 2.5%
8530: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69   performance gai
8540: 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  n..  */.  {.    
8550: 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20  u8 *pOff;       
8560: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65   /* Iterator use
8570: 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63  d to check all c
8580: 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20  ell offsets are 
8590: 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  in range */.    
85a0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
85b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65   /* Pointer to e
85c0: 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65  nd of cell offse
85d0: 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75  t array */.    u
85e0: 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  8 mask;         
85f0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20  /* Mask of bits 
8600: 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72  that must be zer
8610: 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c  o in MSB of cell
8620: 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20   offsets */.    
8630: 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70  mask = ~(((u8)(p
8640: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
8650: 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d  )-1);.    pEnd =
8660: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
8670: 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  t + pPage->nCell
8680: 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66  *2];.    for(pOf
8690: 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  f=&data[cellOffs
86a0: 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20  et]; pOff!=pEnd 
86b0: 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73  && !((*pOff)&mas
86c0: 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20  k); pOff+=2);.  
86d0: 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64    if( pOff!=pEnd
86e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
86f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8700: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
8710: 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61 67  #endif..    pPag
8720: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
8730: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
8740: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8750: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
8760: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
8770: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
8780: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
8790: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
87a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
87b0: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
87c0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
87d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
87e0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
87f0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
8800: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
8810: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
8820: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
8830: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
8840: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8850: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
8860: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
8870: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
8880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8890: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
88a0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
88b0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
88c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
88d0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
88e0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
88f0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
8900: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
8910: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
8920: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
8930: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8940: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8950: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8960: 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b   /*memset(&data[
8970: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
8980: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
8990: 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  */.  data[hdr] =
89a0: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
89b0: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20  first = hdr + 8 
89c0: 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f  + 4*((flags&PTF_
89d0: 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a  LEAF)==0 ?1:0);.
89e0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
89f0: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
8a00: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
8a10: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
8a20: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
8a30: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
8a40: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
8a50: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
8a60: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
8a70: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
8a80: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
8a90: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
8aa0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
8ab0: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
8ac0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
8ad0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
8ae0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
8af0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
8b00: 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67  =32768 );.  pPag
8b10: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
8b20: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
8b30: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
8b40: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
8b50: 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
8b60: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
8b70: 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
8b80: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
8b90: 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
8ba0: 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
8bb0: 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
8bc0: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
8bd0: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
8be0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
8bf0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
8c00: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
8c10: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
8c20: 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
8c30: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
8c40: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
8c50: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
8c60: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
8c70: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  age);.  pPage->p
8c80: 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
8c90: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d  ;.  pPage->pBt =
8ca0: 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70   pBt;.  pPage->p
8cb0: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50  gno = pgno;.  pP
8cc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
8cd0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
8ce0: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74  ? 100 : 0;.  ret
8cf0: 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
8d00: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
8d10: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
8d20: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
8d30: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
8d40: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
8d50: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
8d60: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
8d70: 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
8d80: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
8d90: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
8da0: 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
8db0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
8dc0: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
8dd0: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
8de0: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
8df0: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
8e00: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
8e10: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
8e20: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
8e30: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
8e40: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
8e50: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
8e60: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
8e70: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
8e80: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
8e90: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
8ea0: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
8eb0: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
8ec0: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
8ed0: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
8ee0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
8ef0: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
8f00: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
8f10: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
8f20: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
8f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8f40: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
8f50: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
8f60: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
8f70: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
8f80: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
8f90: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
8fa0: 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
8fb0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61     /* Do not loa
8fc0: 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  d page content i
8fd0: 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
8fe0: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
8ff0: 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
9000: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9010: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
9020: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
9030: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
9040: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
9050: 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
9060: 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65  pDbPage, noConte
9070: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
9080: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
9090: 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
90a0: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
90b0: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
90c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
90d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
90e0: 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
90f0: 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
9100: 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
9110: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
9120: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
9130: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
9140: 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
9150: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
9160: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
9170: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
9180: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
9190: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
91a0: 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
91b0: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
91c0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
91d0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
91e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
91f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
9200: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
9210: 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
9220: 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
9230: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
9240: 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
9250: 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
9260: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
9270: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
9280: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
9290: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
92a0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
92b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
92c0: 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
92d0: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
92e0: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
92f0: 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
9300: 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
9310: 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67  ic Pgno pagerPag
9320: 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
9330: 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61  *pBt){.  int nPa
9340: 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  ge = -1;.  int r
9350: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  c;.  assert( pBt
9360: 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63  ->pPage1 );.  rc
9370: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
9380: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
9390: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
93a0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
93b0: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d  ITE_OK || nPage=
93c0: 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =-1 );.  return 
93d0: 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a  (Pgno)nPage;.}..
93e0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
93f0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
9400: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
9410: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
9420: 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f  .** is just a co
9430: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
9440: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
9450: 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  e calls to.** sq
9460: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
9470: 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42  e() and sqlite3B
9480: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
9490: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
94a0: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
94b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
94c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
94d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
94e0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
94f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9500: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
9510: 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
9520: 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a   **ppPage     /*
9530: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
9540: 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
9550: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
9560: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
9570: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9580: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
9590: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
95a0: 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
95b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
95c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
95d0: 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f 66  }..  /* It is of
95e0: 74 65 6e 20 74 68 65 20 63 61 73 65 20 74 68 61  ten the case tha
95f0: 74 20 74 68 65 20 70 61 67 65 20 77 65 20 77 61  t the page we wa
9600: 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  nt is already in
9610: 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20   cache..  ** If 
9620: 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65 63  so, get it direc
9630: 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65 73  tly.  This saves
9640: 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20   us from having 
9650: 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67  to call.  ** pag
9660: 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74 6f  erPagecount() to
9670: 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f 20   make sure pgno 
9680: 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74 73  is within limits
9690: 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 0a  , which results.
96a0: 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75 72    ** in a measur
96b0: 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63  eable performanc
96c0: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a  e improvements..
96d0: 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 20 3d    */.  *ppPage =
96e0: 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
96f0: 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 70 67  geLookup(pBt, pg
9700: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
9710: 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20   ){.    /* Page 
9720: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  is already in ca
9730: 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  che */.    rc = 
9740: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
9750: 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20  se{.    /* Page 
9760: 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20 41  not in cache.  A
9770: 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20 20  cquire it. */.  
9780: 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72    if( pgno>pager
9790: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
97a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
97b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
97c0: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72  PT; .    }.    r
97d0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
97e0: 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
97f0: 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
9800: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
9810: 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
9820: 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a   = *ppPage;.  }.
9830: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
9840: 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  Init ){.    rc =
9850: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
9860: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9870: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
9880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c  TE_OK ){.    rel
9890: 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
98a0: 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
98b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
98c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
98d0: 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20  ase a MemPage.  
98e0: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63  This should be c
98f0: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
9900: 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c  ach prior.** cal
9910: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
9920: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
9930: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
9940: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
9950: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
9960: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
9970: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
9980: 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  w==0 || sqlite3P
9990: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
99a0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
99b0: 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >1 );.    assert
99c0: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
99d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
99e0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
99f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9a00: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
9a10: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
9a20: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
9a30: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9a40: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
9a50: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
9a60: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
9a70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
9a80: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9a90: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9aa0: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
9ab0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
9ac0: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
9ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  .}../*.** During
9ae0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
9af0: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
9b00: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
9b10: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
9b20: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
9b30: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
9b40: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
9b50: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
9b60: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
9b70: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
9b80: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
9b90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9ba0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
9bb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
9bc0: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
9bd0: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
9be0: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
9bf0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
9c00: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
9c10: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
9c20: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
9c30: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
9c40: 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
9c50: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
9c60: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
9c70: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
9c80: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
9c90: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
9ca0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
9cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9cc0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9cd0: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
9ce0: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
9cf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
9d00: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
9d10: 44 61 74 61 29 3e 30 20 29 7b 0a 20 20 20 20 20  Data)>0 ){.     
9d20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
9d30: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9d40: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9d50: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
9d60: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
9d70: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
9d80: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
9d90: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
9da0: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
9db0: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
9dc0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
9dd0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
9de0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9df0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
9e00: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
9e10: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
9e20: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
9e30: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
9e40: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
9e50: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
9e60: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
9e70: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
9e80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
9e90: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
9ea0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
9eb0: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
9ec0: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
9ed0: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
9ee0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
9ef0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
9f00: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
9f10: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
9f20: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
9f30: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
9f40: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
9f50: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
9f60: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9f70: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
9f80: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
9f90: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
9fa0: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
9fb0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
9fc0: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
9fd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
9fe0: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
9ff0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
a000: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
a010: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
a020: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a030: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
a040: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
a050: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
a060: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
a070: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
a080: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
a090: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
a0a0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0c0: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
a0d0: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
a0e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
a0f0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
a100: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
a110: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  n() */.){.  sqli
a120: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
a130: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
a140: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
a150: 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  tree */.  BtShar
a160: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
a170: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
a180: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
a190: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
a1a0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a1b0: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
a1c0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
a1d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a1e0: 75 38 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75  u8 nReserve;.  u
a1f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
a200: 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20  Header[100];..  
a210: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
a220: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
a230: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
a240: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
a250: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
a260: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
a270: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
a280: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
a290: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
a2a0: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
a2b0: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
a2c0: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
a2d0: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
a2e0: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
a2f0: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
a300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a310: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
a320: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
a330: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
a340: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
a350: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
a360: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
a370: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
a380: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
a390: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
a3a0: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
a3b0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
a3c0: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
a3d0: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
a3e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
a3f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a400: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
a410: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
a420: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
a430: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
a440: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
a450: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
a460: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a470: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
a480: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
a490: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
a4a0: 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66   = db;..#if !def
a4b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a4c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
a4d0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
a4e0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
a4f0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
a500: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
a510: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
a520: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
a530: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
a540: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
a550: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
a560: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
a570: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
a580: 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61  0.   && (db->fla
a590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62  gs & SQLITE_Vtab
a5a0: 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65  )==0.   && zFile
a5b0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
a5c0: 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66  e[0].  ){.    if
a5d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
a5e0: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
a5f0: 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
a600: 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
a610: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
a620: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
a630: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
a640: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
a650: 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  loc(nFullPathnam
a660: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
a670: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
a680: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73  ared;.      p->s
a690: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
a6a0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
a6b0: 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63  SQLITE_SharedCac
a6c0: 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  he;.      if( !z
a6d0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
a6e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a6f0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
a700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a710: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
a720: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
a730: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
a740: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
a750: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
a760: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
a770: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
a780: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
a790: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
a7a0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
a7b0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
a7c0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
a7d0: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
a7e0: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
a7f0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
a800: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
a810: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
a820: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a830: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
a840: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
a850: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
a860: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
a870: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
a880: 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  >pPager)).      
a890: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
a8a0: 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
a8b0: 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
a8c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
a8d0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
a8e0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
a8f0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
a900: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
a910: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a920: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a930: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
a940: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a950: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
a960: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
a970: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
a980: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
a990: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
a9a0: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
a9b0: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
a9c0: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
a9d0: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
a9e0: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
a9f0: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
aa00: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
aa10: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
aa20: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
aa30: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
aa40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
aa50: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
aa60: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
aa70: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
aa80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
aa90: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
aaa0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
aab0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
aac0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
aad0: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
aae0: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
aaf0: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
ab00: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
ab10: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
ab20: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
ab30: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
ab40: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
ab50: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
ab60: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
ab70: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
ab80: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
ab90: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
aba0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
abb0: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
abc0: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
abd0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
abe0: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
abf0: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
ac00: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
ac10: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
ac20: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
ac30: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
ac40: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
ac50: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
ac60: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
ac70: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
ac80: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
ac90: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
aca0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
acb0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
acc0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
acd0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ace0: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
acf0: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
ad00: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
ad30: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
ad40: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
ad50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ad60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ad70: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
ad80: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
ad90: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
ada0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
adb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
adc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
add0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
ade0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
adf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
ae00: 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
ae10: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72  pBt->pPager, btr
ae20: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
ae30: 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70  ler, pBt);.    p
ae40: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
ae50: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ae60: 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d  SetReiniter(pBt-
ae70: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69  >pPager, pageRei
ae80: 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  nit);.    pBt->p
ae90: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
aea0: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
aeb0: 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e  .    pBt->readOn
aec0: 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ly = sqlite3Page
aed0: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
aee0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42  >pPager);.    pB
aef0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65  t->pageSize = ge
af00: 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t2byte(&zDbHeade
af10: 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  r[16]);.    if( 
af20: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
af30: 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
af40: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
af50: 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
af60: 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
af70: 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
af80: 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
af90: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
afa0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
afb0: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
afc0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
afd0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
afe0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aff0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
b000: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
b010: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
b020: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
b030: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
b040: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
b050: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
b060: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
b070: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
b080: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
b090: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
b0a0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
b0b0: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
b0c0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
b0d0: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
b0e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
b0f0: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
b100: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
b110: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
b120: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
b130: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
b140: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
b150: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
b160: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
b170: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
b180: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
b190: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
b1a0: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
b1b0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
b1c0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
b1d0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
b1e0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
b1f0: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
b200: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
b210: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
b220: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
b230: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
b240: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b250: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
b260: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
b270: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
b280: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
b290: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b2a0: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
b2b0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
b2c0: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
b2d0: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
b2e0: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
b2f0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
b300: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
b310: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
b320: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
b330: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
b340: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
b350: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
b360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
b370: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
b380: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
b390: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
b3a0: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73  ageSize */.    s
b3b0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
b3c0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
b3d0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
b3e0: 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64 65  ze);.   .#if !de
b3f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b400: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
b410: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
b420: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
b430: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
b440: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
b450: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
b460: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
b470: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
b480: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
b490: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
b4a0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
b4b0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
b4c0: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
b4d0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
b4e0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
b4f0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
b500: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
b510: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
b520: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
b530: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
b540: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
b550: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
b560: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
b570: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
b580: 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
b590: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
b5a0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
b5b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b5c0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
b5d0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
b5e0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
b5f0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
b600: 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
b610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b620: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
b630: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
b640: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
b650: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
b660: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
b670: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
b680: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
b690: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
b6a0: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
b6b0: 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
b6c0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
b6d0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
b6e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
b6f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b700: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
b710: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
b720: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
b730: 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
b740: 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
b750: 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
b760: 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
b770: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
b780: 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
b790: 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
b7a0: 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
b7b0: 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
b7c0: 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
b7d0: 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
b7e0: 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
b7f0: 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
b800: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
b810: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
b820: 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
b830: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
b840: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
b850: 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
b860: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
b870: 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
b880: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
b890: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
b8a0: 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
b8b0: 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
b8c0: 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
b8d0: 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
b8e0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
b8f0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
b900: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
b910: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
b920: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
b930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b940: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
b950: 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
b960: 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
b970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b980: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
b990: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
b9a0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
b9b0: 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
b9c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
b9d0: 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
b9e0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
b9f0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
ba00: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
ba10: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
ba20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
ba30: 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
ba40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ba50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ba60: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ba70: 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
ba80: 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
ba90: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
baa0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
bab0: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
bac0: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
bad0: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
bae0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
baf0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
bb00: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
bb10: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
bb20: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
bb30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bb40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
bb50: 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
bb60: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
bb70: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
bb80: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
bb90: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
bba0: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
bbb0: 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
bbc0: 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
bbd0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
bbe0: 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
bbf0: 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
bc00: 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
bc10: 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
bc20: 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
bc30: 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
bc40: 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
bc50: 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
bc60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
bc70: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
bc80: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
bc90: 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
bca0: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
bcb0: 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
bcc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
bcd0: 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
bce0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
bcf0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
bd00: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
bd10: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
bd20: 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
bd30: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
bd40: 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
bd50: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
bd60: 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
bd70: 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
bd80: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
bd90: 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
bda0: 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
bdb0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
bdc0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
bdd0: 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
bde0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bdf0: 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
be00: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
be10: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
be20: 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
be30: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
be40: 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
be50: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
be60: 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
be70: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
be80: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
be90: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
bea0: 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
beb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
bec0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
bed0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
bee0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
bef0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
bf00: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
bf10: 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
bf20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
bf30: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
bf40: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
bf50: 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
bf60: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
bf70: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
bf80: 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
bf90: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
bfa0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
bfb0: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
bfc0: 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
bfd0: 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
bfe0: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
bff0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
c000: 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
c010: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
c020: 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
c030: 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
c040: 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
c050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
c060: 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
c070: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
c080: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
c090: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
c0a0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
c0b0: 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
c0c0: 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
c0d0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
c0e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
c0f0: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
c100: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
c110: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
c120: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c130: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
c140: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
c150: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
c160: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
c170: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
c180: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
c190: 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
c1a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
c1b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
c1c0: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
c1d0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c1e0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
c1f0: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70  >db = p->db;.  p
c200: 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
c210: 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
c220: 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
c230: 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
c240: 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
c250: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
c260: 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
c270: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c280: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
c290: 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
c2a0: 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
c2b0: 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
c2c0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
c2d0: 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
c2e0: 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
c2f0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
c300: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
c310: 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
c320: 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
c330: 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
c340: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
c350: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  eeRollback(p);. 
c360: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c370: 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
c380: 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
c390: 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
c3a0: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
c3b0: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
c3c0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
c3d0: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
c3e0: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
c3f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
c400: 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
c410: 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
c420: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
c430: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
c440: 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
c450: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
c460: 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
c470: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
c480: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
c490: 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
c4a0: 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
c4b0: 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
c4c0: 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
c4d0: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
c4e0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
c4f0: 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
c500: 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
c510: 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
c520: 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
c530: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
c540: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
c550: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
c560: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
c570: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
c580: 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
c590: 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
c5a0: 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
c5b0: 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
c5c0: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
c5d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
c5e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
c5f0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
c600: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
c610: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
c620: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c630: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
c640: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
c650: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
c660: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
c670: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
c680: 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
c690: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
c6a0: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
c6b0: 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
c6c0: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
c6d0: 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
c6e0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
c6f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
c710: 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
c720: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
c730: 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
c740: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
c750: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
c760: 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
c770: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
c780: 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
c790: 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
c7a0: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
c7b0: 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
c7c0: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
c7d0: 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
c7e0: 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
c7f0: 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
c800: 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
c810: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
c820: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
c830: 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
c840: 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
c850: 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
c860: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
c870: 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
c880: 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
c890: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
c8a0: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
c8b0: 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
c8c0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
c8d0: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
c8e0: 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
c8f0: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
c900: 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
c910: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
c920: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
c930: 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
c940: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
c950: 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
c960: 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
c970: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
c980: 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
c990: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
c9a0: 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
c9b0: 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
c9c0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
c9d0: 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
c9e0: 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
c9f0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
ca00: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
ca10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ca20: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
ca30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
ca40: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
ca50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
ca60: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
ca70: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
ca80: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
ca90: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
caa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
cac0: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
cad0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
cae0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
caf0: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
cb00: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
cb10: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
cb20: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
cb30: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
cb40: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
cb50: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
cb60: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
cb70: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
cb80: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
cb90: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
cba0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
cbb0: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
cbc0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
cbd0: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
cbe0: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
cbf0: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
cc00: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
cc10: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
cc20: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
cc30: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
cc40: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
cc50: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
cc60: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
cc70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cc80: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
cc90: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
cca0: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
ccb0: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
ccc0: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53  level, int fullS
ccd0: 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ync){.  BtShared
cce0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
ccf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cd00: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
cd10: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
cd20: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
cd30: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
cd40: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
cd50: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
cd60: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
cd70: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
cd80: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
cd90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
cda0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
cdb0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
cdc0: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
cdd0: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
cde0: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
cdf0: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
ce00: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
ce10: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
ce20: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
ce30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
ce40: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
ce50: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
ce60: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ce70: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
ce80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ce90: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
cea0: 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
ceb0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
cec0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
ced0: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
cee0: 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
cef0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
cf00: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
cf10: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
cf20: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
cf30: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
cf40: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
cf50: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
cf60: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cf70: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
cf80: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
cf90: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
cfa0: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
cfb0: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
cfc0: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s per page..**.*
cfd0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
cfe0: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
cff0: 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
d000: 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
d010: 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
d020: 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
d030: 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
d040: 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
d050: 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
d060: 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
d070: 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
d080: 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
d090: 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
d0a0: 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
d0b0: 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
d0c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
d0d0: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
d0e0: 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
d0f0: 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
d100: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
d110: 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
d120: 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
d130: 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
d140: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
d150: 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
d160: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
d170: 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
d180: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
d190: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
d1a0: 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
d1b0: 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
d1c0: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
d1d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
d1e0: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
d1f0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
d200: 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
d210: 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
d220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
d230: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
d240: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
d250: 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
d260: 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
d270: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
d280: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
d290: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
d2a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
d2b0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
d2c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d2d0: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
d2e0: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
d2f0: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
d300: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
d310: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
d320: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d330: 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
d340: 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
d350: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
d360: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
d370: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
d380: 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
d390: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
d3a0: 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
d3b0: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
d3c0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
d3d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
d3e0: 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
d3f0: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
d400: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
d410: 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
d420: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
d430: 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
d440: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
d450: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
d460: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
d470: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74  Size);.  }.  pBt
d480: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
d490: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
d4a0: 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
d4b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
d4c0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
d4d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
d4e0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
d4f0: 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
d500: 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
d510: 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
d520: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
d530: 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
d540: 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71  geSize;.}.int sq
d550: 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
d560: 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
d570: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
d580: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
d590: 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
d5a0: 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
d5b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
d5c0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
d5d0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
d5e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
d5f0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
d600: 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
d610: 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
d620: 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
d630: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
d640: 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
d650: 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
d660: 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
d670: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
d680: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
d690: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
d6a0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
d6b0: 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
d6c0: 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
d6d0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
d6e0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
d6f0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
d700: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
d710: 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
d720: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
d730: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
d740: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
d750: 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66  turn n;.}.#endif
d760: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
d770: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
d780: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
d790: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d7a0: 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
d7b0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
d7c0: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
d7d0: 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
d7e0: 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
d7f0: 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
d800: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
d810: 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
d820: 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
d830: 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
d840: 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
d850: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
d860: 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
d870: 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
d880: 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
d890: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
d8a0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
d8b0: 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
d8c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
d8d0: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
d8e0: 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
d8f0: 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
d900: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d910: 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
d920: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
d930: 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
d940: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
d950: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d960: 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 61 75  OK;.  u8 av = au
d970: 74 6f 56 61 63 75 75 6d 20 3f 31 3a 30 3b 0a 0a  toVacuum ?1:0;..
d980: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
d990: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
d9a0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
d9b0: 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74   && av!=pBt->aut
d9c0: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
d9d0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
d9e0: 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
d9f0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
da00: 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71  m = av;.  }.  sq
da10: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
da20: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
da30: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
da40: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
da50: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
da60: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
da70: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
da80: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
da90: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
daa0: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
dab0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
dac0: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
dad0: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
dae0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
daf0: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
db00: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
db10: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
db20: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
db30: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
db40: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
db50: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
db60: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
db70: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
db80: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
db90: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
dba0: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
dbb0: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
dbc0: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
dbd0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
dbe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
dbf0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
dc00: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
dc10: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
dc20: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
dc30: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
dc40: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
dc50: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
dc60: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
dc70: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
dc80: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
dc90: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
dca0: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
dcb0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
dcc0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dcd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
dce0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
dcf0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
dd00: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
dd10: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
dd20: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
dd30: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
dd40: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
dd50: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
dd60: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
dd70: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
dd80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
dd90: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
dda0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ddb0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
ddc0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
ddd0: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ddf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
de00: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
de10: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
de20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
de30: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
de40: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
de50: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
de60: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
de70: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
de80: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
de90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
dea0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
deb0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
dec0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
ded0: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
dee0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
def0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
df00: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65  nit_failed;.  }e
df10: 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20  lse if( nPage>0 
df20: 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53  ){.    int pageS
df30: 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61  ize;.    int usa
df40: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
df50: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
df60: 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
df70: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
df80: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
df90: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
dfa0: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
dfb0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
dfc0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
dfd0: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
dfe0: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
dff0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
e000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e010: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
e020: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
e030: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
e040: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d   }..    /* The m
e050: 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
e060: 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
e070: 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
e080: 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
e090: 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
e0a0: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
e0b0: 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
e0c0: 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
e0d0: 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
e0e0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
e0f0: 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
e100: 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
e110: 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
e120: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
e130: 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
e140: 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
e150: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
e160: 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
e170: 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
e180: 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
e190: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
e1a0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
e1b0: 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
e1c0: 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b  get2byte(&page1[
e1d0: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28  16]);.    if( ((
e1e0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
e1f0: 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65  Size)!=0 || page
e200: 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20  Size<512 ||.    
e210: 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f      (SQLITE_MAX_
e220: 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20  PAGE_SIZE<32768 
e230: 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  && pageSize>SQLI
e240: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
e250: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
e260: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
e270: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
e280: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
e290: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
e2a0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
e2b0: 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
e2c0: 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67  20];.    if( pag
e2d0: 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
e2e0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
e2f0: 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
e300: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
e310: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
e320: 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
e330: 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
e340: 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
e350: 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
e360: 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
e370: 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
e380: 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
e390: 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
e3a0: 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
e3b0: 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
e3c0: 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
e3d0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
e3e0: 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
e3f0: 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
e400: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
e410: 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
e420: 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
e430: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
e440: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
e450: 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
e460: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28  ->usableSize = (
e470: 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u16)usableSize;.
e480: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
e490: 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
e4a0: 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
e4b0: 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
e4c0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
e4d0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
e4e0: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
e4f0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
e500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e510: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
e520: 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20   usableSize<500 
e530: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
e540: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
e550: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
e560: 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
e570: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
e580: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
e590: 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b  (u16)usableSize;
e5a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e5b0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
e5c0: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
e5d0: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
e5e0: 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
e5f0: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
e600: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
e610: 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
e620: 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
e630: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
e640: 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
e650: 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
e660: 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
e670: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
e680: 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
e690: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
e6a0: 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
e6b0: 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
e6c0: 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
e6d0: 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
e6e0: 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
e6f0: 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
e700: 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
e710: 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
e720: 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
e730: 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
e740: 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
e750: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
e760: 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
e770: 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
e780: 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
e790: 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
e7a0: 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
e7b0: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
e7c0: 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
e7d0: 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
e7e0: 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
e7f0: 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
e800: 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20  oiner, a header 
e810: 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
e820: 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
e830: 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
e840: 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
e850: 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
e860: 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
e870: 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
e880: 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
e890: 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  maxLocal = (pBt-
e8a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
e8b0: 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  64/255 - 23;.  p
e8c0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
e8d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
e8e0: 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
e8f0: 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
e900: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
e910: 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
e920: 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
e930: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
e940: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73  /255 - 23;.  ass
e950: 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
e960: 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
e970: 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
e980: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
e990: 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
e9a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
e9b0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
e9c0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
e9d0: 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
e9e0: 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
e9f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
ea00: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
ea10: 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
ea20: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
ea30: 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
ea40: 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
ea50: 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
ea60: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
ea70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
ea80: 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
ea90: 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
eaa0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
eab0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
eac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
ead0: 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b  dsMutex(pRef) );
eae0: 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54  .  if( pRef->inT
eaf0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
eb00: 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61   ){.    u8 inTra
eb10: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d  nsaction = pRef-
eb20: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
eb30: 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e  ion;.    btreeIn
eb40: 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
eb50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
eb60: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
eb70: 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65  Ref, 0);.    pRe
eb80: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
eb90: 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61  ction = inTransa
eba0: 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d  ction;.    pRef-
ebb0: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
ebc0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72  _NONE;.    if( r
ebd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ebe0: 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d        pRef->pBt-
ebf0: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
ec00: 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65  .    }.    btree
ec10: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
ec20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ec30: 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a  ;.}.       ../*.
ec40: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
ec50: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
ec60: 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
ec70: 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
ec80: 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
ec90: 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
eca0: 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
ecb0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
ecc0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
ecd0: 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
ece0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
ecf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ed00: 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
ed10: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
ed20: 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
ed30: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
ed40: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
ed50: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
ed60: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
ed70: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
ed80: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
ed90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
eda0: 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
edb0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
edc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
edd0: 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
ede0: 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
edf0: 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
ee00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ee10: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
ee20: 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
ee30: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
ee40: 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43  _NONE && pBt->pC
ee50: 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d  ursor==0 && pBt-
ee60: 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
ee70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
ee80: 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
ee90: 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20  pPager)>=1 ){.  
eea0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
eeb0: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
eec0: 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69 66  ;.#if 0.      if
eed0: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
eee0: 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
eef0: 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
ef00: 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  e = pBt->pPage1;
ef10: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
ef20: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
ef30: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
ef40: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
ef50: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20       pPage->pBt 
ef60: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70  = pBt;.        p
ef70: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a  Page->pgno = 1;.
ef80: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
ef90: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
efa0: 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
efb0: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50     }.    pBt->pP
efc0: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
efd0: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
efe0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
eff0: 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  te a new databas
f000: 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
f010: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
f020: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e   of the.** file.
f030: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
f040: 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
f050: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
f060: 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
f070: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
f080: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
f090: 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  t nPage;..  asse
f0a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f0b0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
f0c0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
f0d0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
f0e0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
f0f0: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
f100: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
f110: 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
f120: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
f130: 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
f140: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
f150: 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
f160: 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
f170: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
f180: 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
f190: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
f1a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
f1b0: 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
f1c0: 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
f1d0: 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
f1e0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
f1f0: 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
f200: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
f210: 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70  data[16], pBt->p
f220: 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
f230: 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
f240: 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
f250: 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
f260: 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
f270: 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
f280: 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
f290: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
f2a0: 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
f2b0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
f2c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
f2d0: 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
f2e0: 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
f2f0: 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
f300: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
f310: 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
f320: 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
f330: 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
f340: 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
f350: 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  TA );.  pBt->pag
f360: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
f370: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f380: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
f390: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
f3a0: 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
f3b0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
f3c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f3d0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
f3e0: 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
f3f0: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
f400: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
f410: 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
f420: 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
f430: 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
f440: 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
f450: 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
f460: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
f480: 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
f490: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
f4a0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
f4b0: 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
f4c0: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
f4d0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
f4e0: 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
f4f0: 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
f500: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
f510: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
f520: 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
f530: 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
f540: 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
f550: 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
f560: 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
f570: 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
f580: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
f590: 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
f5a0: 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
f5b0: 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
f5c0: 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
f5d0: 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
f5e0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
f5f0: 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
f600: 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
f610: 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
f620: 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
f630: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
f640: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
f650: 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
f660: 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
f670: 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
f680: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
f690: 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
f6a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
f6b0: 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
f6c0: 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
f6d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
f6e0: 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
f6f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
f700: 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
f710: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
f720: 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
f730: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
f740: 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
f750: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
f760: 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
f770: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
f780: 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
f790: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
f7a0: 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
f7b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f7c0: 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
f7d0: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
f7e0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
f7f0: 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
f800: 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
f810: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
f820: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
f830: 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
f840: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
f850: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
f860: 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
f870: 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
f880: 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
f890: 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
f8a0: 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
f8b0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
f8c0: 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
f8d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
f8e0: 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
f8f0: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
f900: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
f910: 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
f920: 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
f930: 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
f940: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
f950: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
f960: 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
f970: 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
f980: 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
f990: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
f9a0: 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
f9b0: 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
f9c0: 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
f9d0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
f9e0: 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
f9f0: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
fa00: 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
fa10: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
fa20: 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
fa30: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
fa40: 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
fa50: 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
fa60: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
fa70: 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
fa80: 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
fa90: 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
faa0: 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
fab0: 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
fac0: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
fad0: 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
fae0: 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
faf0: 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
fb00: 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
fb10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
fb20: 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
fb30: 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
fb40: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
fb50: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
fb60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
fb70: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
fb80: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
fb90: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72  b = p->db;.  btr
fba0: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
fbb0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
fbc0: 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
fbd0: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
fbe0: 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
fbf0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
fc00: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
fc10: 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
fc20: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
fc30: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
fc40: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
fc50: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
fc60: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
fc70: 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
fc80: 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
fc90: 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
fca0: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
fcb0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
fcc0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
fcd0: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
fce0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
fcf0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
fd00: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
fd10: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
fd20: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
fd30: 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
fd40: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
fd50: 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
fd60: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
fd70: 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
fd80: 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
fd90: 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
fda0: 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
fdb0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
fdc0: 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
fdd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
fde0: 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
fdf0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
fe00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
fe10: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
fe20: 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77  TRANS_WRITE && w
fe30: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
fe40: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
fe50: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
fe60: 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
fe70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
fe80: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
fe90: 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
fea0: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
feb0: 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
fec0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
fed0: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
fee0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
fef0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
ff00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ff10: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
ff20: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
ff30: 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a  _begun;.      }.
ff40: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ff50: 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
ff60: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
ff70: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
ff80: 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74       rc = lockBt
ff90: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ree(pBt);.      
ffa0: 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61  }while( pBt->pPa
ffb0: 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ge1==0 && rc==SQ
ffc0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
ffd0: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
ffe0: 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
fff0: 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
10000 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
10010 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10020 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
10030 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10040 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10050 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
10060 50 61 67 65 72 2c 20 77 72 66 6c 61 67 3e 31 29  Pager, wrflag>1)
10070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
10080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10090 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
100a0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
100b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
100c0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
100d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
100e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72   ){.      if( wr
100f0 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74  flag ) pBt->inSt
10100 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  mt = 0;.    }els
10110 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  e{.      unlockB
10120 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
10130 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
10140 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
10150 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
10160 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
10170 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
10180 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
10190 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
101a0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
101b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
101c0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
101d0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
101e0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
101f0 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on++;.    }.    
10200 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
10210 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
10220 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
10230 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
10240 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
10250 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
10260 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
10270 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
10280 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
10290 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
102a0 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
102b0 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 61  lag>1 ){.      a
102c0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 45 78  ssert( !pBt->pEx
102d0 63 6c 75 73 69 76 65 20 29 3b 0a 20 20 20 20 20  clusive );.     
102e0 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
102f0 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = p;.    }.#end
10300 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62  if.  }...trans_b
10310 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
10320 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
10330 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
10340 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
10350 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
10360 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
10370 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
10380 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
10390 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
103a0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
103b0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
103c0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
103d0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
103e0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
103f0 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
10400 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
10410 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
10420 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
10430 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
10440 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
10450 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
10460 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
10470 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10480 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
10490 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
104a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
104b0 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
104c0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
104d0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
104e0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
104f0 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
10500 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
10510 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
10520 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
10530 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
10540 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
10550 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
10560 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
10570 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
10580 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
10590 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
105a0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
105d0 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
105e0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10610 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
10620 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
10630 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10660 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
10670 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
10680 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
10690 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
106a0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
106b0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
106c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
106d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
106e0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
106f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
10700 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
10710 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
10720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10730 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
10740 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a  trmaps_out;.  }.
10750 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
10760 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
10770 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
10780 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
10790 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
107a0 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d  e, i);..    rc =
107b0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
107c0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
107d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
107e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
107f0 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
10800 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
10810 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
10820 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
10830 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
10840 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
10850 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
10860 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
10870 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
10880 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  TREE, pgno);.   
10890 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
108a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f  E_OK ) goto set_
108b0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
108c0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
108d0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
108e0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
108f0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
10900 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
10910 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10920 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  +8]);.    rc = p
10930 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
10940 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
10950 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
10960 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
10970 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
10980 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
10990 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
109a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
109b0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
109c0 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72 65  , which is guare
109d0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62 74  nteed to be a bt
109e0 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e  ree page, not an
109f0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
10a00 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
10a10 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d  to page iFrom. M
10a20 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
10a30 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  er so that it po
10a40 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20  ints to.** iTo. 
10a50 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
10a60 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
10a70 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
10a80 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
10a90 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   .** follows:.**
10aa0 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
10ab0 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
10ac0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
10ad0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
10ae0 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
10b10 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
10b20 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
10b30 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
10b40 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
10b50 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
10b60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10b70 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
10b80 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
10b90 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
10ba0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
10bb0 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
10bc0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
10bd0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
10be0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
10bf0 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
10c00 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
10c10 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
10c20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
10c30 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
10c40 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
10c50 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
10c60 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
10c70 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
10c80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10c90 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
10ca0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
10cb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
10cc0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
10cd0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
10ce0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
10cf0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
10d00 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
10d10 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
10d20 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
10d30 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
10d40 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
10d50 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
10d60 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
10d70 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
10d80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10d90 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
10da0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
10db0 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
10dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69   }else{.    u8 i
10dd0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
10de0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
10df0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
10e00 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ell;..    sqlite
10e10 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
10e20 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  Page);.    nCell
10e30 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
10e40 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
10e50 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
10e60 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
10e70 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
10e80 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
10e90 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
10ea0 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
10eb0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
10ec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
10ed0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
10ee0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
10ef0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
10f00 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
10f10 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
10f20 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
10f30 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
10f40 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20  Overflow]) ){.  
10f50 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
10f60 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
10f70 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
10f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
10f90 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
10fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
10fc0 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
10fd0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
10fe0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
10ff0 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
11000 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11020 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
11030 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
11040 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
11050 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
11060 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
11070 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
11080 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
11090 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
110a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
110b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
110c0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
110d0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
110e0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
110f0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
11100 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
11110 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
11120 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
11130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11140 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
11150 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
11160 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
11170 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
11180 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
11190 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
111a0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
111b0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
111c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
111d0 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
111e0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
111f0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
11200 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
11210 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
11220 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
11230 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
11240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11250 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
11260 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
11270 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
11280 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
11290 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
112a0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
112b0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
112c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
112d0 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
112e0 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
112f0 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
11300 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
11310 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  mmit.){.  MemPag
11320 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
11330 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
11340 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
11350 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
11360 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
11370 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
11380 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
11390 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
113a0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
113b0 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
113c0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
113d0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
113e0 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
113f0 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
11400 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
11410 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
11420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11430 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11440 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11450 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
11460 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
11470 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
11480 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
11490 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
114a0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
114b0 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
114c0 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
114d0 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
114e0 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
114f0 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
11500 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
11510 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
11520 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
11530 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
11540 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
11550 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
11560 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
11570 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
11580 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11590 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
115a0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
115b0 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
115c0 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
115d0 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
115e0 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
115f0 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
11600 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
11610 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
11620 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
11630 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
11640 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
11650 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
11660 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
11670 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
11680 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
11690 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
116a0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
116b0 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
116c0 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
116d0 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
116e0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
116f0 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
11700 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
11710 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
11720 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
11730 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
11740 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
11750 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
11760 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
11770 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
11780 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
11790 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
117a0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
117b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
117c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
117d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
117e0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
117f0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
11800 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
11810 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
11820 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
11830 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
11840 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
11850 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
11860 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
11870 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  eePage);.      i
11880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11890 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
118a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
118b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
118c0 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
118d0 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
118e0 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
118f0 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
11900 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
11910 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
11920 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
11930 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
11940 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
11950 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
11960 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
11970 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
11980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
11990 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
119a0 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
119b0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
119c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
119d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
119e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
119f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11a00 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
11a10 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
11a20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11a30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
11a40 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
11a50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11a60 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
11a70 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
11a80 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
11a90 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
11aa0 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
11ab0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
11ac0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
11ae0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
11af0 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
11b00 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a  ype, iPtrPage);.
11b10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11b20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
11b30 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
11b40 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
11b50 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
11b60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
11b70 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
11b80 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
11b90 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
11ba0 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
11bb0 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
11bc0 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
11bd0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
11be0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
11bf0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
11c00 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
11c10 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
11c20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
11c30 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c  .** point in cal
11c40 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
11c50 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
11c60 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  n SQLITE_DONE..*
11c70 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
11c80 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
11c90 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
11ca0 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
11cb0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20  .** database so 
11cc0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
11cd0 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
11ce0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a  urrently in use.
11cf0 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
11d00 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in use..**.** If
11d10 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65   the nFin parame
11d20 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
11d30 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
11d40 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
11d50 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
11d60 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
11d70 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
11d80 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
11d90 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
11da0 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
11db0 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
11dc0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
11dd0 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
11de0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
11df0 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
11e00 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
11e10 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61  complete..*/.sta
11e20 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
11e30 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
11e40 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
11e50 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a   Pgno iLastPg){.
11e60 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
11e70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
11e80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
11e90 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
11ea0 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
11eb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11ec0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
11ed0 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  x) );..  if( !PT
11ee0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
11ef0 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
11f00 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
11f10 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
11f20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
11f30 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
11f40 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
11f50 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
11f60 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
11f70 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
11f80 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
11f90 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69  st==0 || nFin==i
11fa0 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20  LastPg ){.      
11fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
11fc0 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
11fd0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
11fe0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
11ff0 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
12000 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
12020 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12030 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
12040 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
12050 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
12060 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12070 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
12080 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
12090 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
120a0 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29     if( nFin==0 )
120b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
120c0 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
120d0 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
120e0 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
120f0 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
12100 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69      ** if nFin i
12110 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
12120 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
12130 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
12140 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
12150 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
12160 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
12170 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
12180 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
12190 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
121a0 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
121b0 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
121c0 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
121d0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
121e0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
121f0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
12200 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
12210 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
12220 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
12230 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
12240 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
12250 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
12270 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
12280 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
12290 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
122a0 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
122b0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
122c0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
122d0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
122e0 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
122f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12300 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
12310 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
12320 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
12330 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20  ge *pLastPg;..  
12340 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12350 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
12360 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
12370 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
12380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12390 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
123a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
123b0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
123c0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
123d0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
123e0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
123f0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
12400 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
12410 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
12420 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
12430 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
12440 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
12450 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
12460 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
12470 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
12480 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
12490 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
124a0 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
124b0 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
124c0 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
124d0 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
124e0 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
124f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12500 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
12510 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
12520 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
12530 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
12540 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
12550 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
12560 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12580 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
12590 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
125a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
125b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
125c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
125d0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
125e0 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
125f0 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
12600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
12610 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
12620 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
12630 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12640 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
12650 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
12660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12670 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12680 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
12690 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
126a0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
126b0 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a  eePg, nFin!=0);.
126c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
126d0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
126e0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
126f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12700 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
12710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12720 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d    }..  if( nFin=
12730 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
12740 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g--;.    while( 
12750 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
12760 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c  _BYTE_PAGE(pBt)|
12770 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  |PTRMAP_ISPAGE(p
12780 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a  Bt, iLastPg) ){.
12790 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b        iLastPg--;
127a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
127b0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
127c0 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
127d0 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a  , iLastPg);.  }.
127e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
127f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  OK;.}../*.** A w
12800 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
12810 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
12820 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
12830 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
12840 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
12850 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
12860 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
12870 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
12880 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
12890 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
128a0 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
128b0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
128c0 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
128d0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
128e0 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
128f0 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
12900 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
12910 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
12920 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
12930 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
12940 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
12950 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12960 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
12970 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
12980 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12990 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
129a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
129b0 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
129c0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
129d0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
129e0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
129f0 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
12a00 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
12a10 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
12a20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
12a30 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
12a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76    }else{.    inv
12a50 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
12a60 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
12a70 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
12a80 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70 61  mStep(pBt, 0, pa
12a90 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
12aa0 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
12ab0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12ac0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12ad0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12ae0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
12af0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
12b00 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
12b10 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
12b20 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
12b30 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
12b40 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
12b50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
12b60 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
12b70 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
12b80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
12b90 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
12ba0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
12bb0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
12bc0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
12bd0 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
12be0 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
12bf0 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
12c00 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
12c10 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
12c20 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
12c30 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
12c40 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
12c50 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
12c60 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
12c70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12c80 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
12c90 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
12ca0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
12cb0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
12cc0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
12cd0 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
12ce0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12cf0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12d00 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
12d10 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
12d20 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
12d30 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
12d40 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
12d50 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
12d60 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67  gno nFin;.    Pg
12d70 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 50 67  no nFree;.    Pg
12d80 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20  no nPtrmap;.    
12d90 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20 20  Pgno iFree;.    
12da0 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
12db0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
12dc0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
12dd0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
12de0 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 50  pBt);..    if( P
12df0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
12e00 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20  , nOrig) ){.    
12e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12e20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
12e30 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 72 69    }.    if( nOri
12e40 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
12e50 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
12e60 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20     nOrig--;.    
12e70 7d 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  }.    nFree = ge
12e80 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
12e90 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
12ea0 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
12eb0 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
12ec0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
12ed0 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70  Orig)+pgsz/5)/(p
12ee0 67 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e  gsz/5);.    nFin
12ef0 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
12f00 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20   - nPtrmap;.    
12f10 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
12f20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
12f30 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e   && nFin<=PENDIN
12f40 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
12f50 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
12f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
12f70 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
12f80 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
12f90 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
12fa0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
12fb0 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
12fc0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65   }..    for(iFre
12fd0 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
12fe0 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
12ff0 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
13000 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
13010 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
13020 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20  Fin, iFree);.   
13030 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
13040 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
13050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
13060 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
13070 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13080 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13090 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
130a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
130b0 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
130c0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
130d0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
130e0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
130f0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
13100 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
13110 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
13120 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
13130 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29  t->pPager, nFin)
13140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13170 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
13180 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
13190 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
131a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
131b0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
131c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
131d0 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
131e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
131f0 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  OVACUUM */../*.*
13200 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
13210 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
13220 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
13230 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
13240 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
13250 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
13260 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
13270 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
13280 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
13290 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
132a0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
132b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
132c0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
132d0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
132e0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
132f0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
13300 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
13310 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
13320 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
13330 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
13340 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
13350 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
13360 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
13370 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
13380 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
13390 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
133a0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
133b0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
133c0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
133d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
133e0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
133f0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
13400 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
13410 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
13420 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
13430 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
13440 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
13450 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
13460 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
13470 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
13480 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
13490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
134a0 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65  mit() for the se
134b0 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
134c0 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
134d0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
134e0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
134f0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
13500 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
13510 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
13520 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
13530 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
13540 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
13550 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
13560 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
13570 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
13580 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
13590 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
135a0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
135b0 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
135c0 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
135d0 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
135e0 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
135f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
13600 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
13610 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
13620 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
13630 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
13640 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13650 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
13660 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
13670 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
13680 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
13690 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
136a0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
136b0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
136c0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
136d0 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
136e0 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
136f0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
13700 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13710 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
13720 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
13730 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
13740 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
13750 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
13760 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
13770 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
13780 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
13790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
137a0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
137b0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
137c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
137d0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
137e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
137f0 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
13800 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  p->db;.#ifndef S
13810 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13820 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
13830 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
13840 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
13850 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
13860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13880 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
13890 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
138a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
138b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
138c0 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
138d0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
138e0 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
138f0 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  ger, zMaster, 0)
13900 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
13910 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
13920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13930 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
13940 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
13950 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
13960 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
13970 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
13980 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
13990 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
139a0 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
139b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
139c0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
139d0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
139e0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  and should be in
139f0 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  voked.** prior t
13a00 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
13a10 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
13a20 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20  ite3BtreeSync() 
13a30 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61  routine did.** a
13a40 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
13a50 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
13a60 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
13a70 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
13a80 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
13a90 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
13aa0 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
13ab0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
13ac0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
13ad0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
13ae0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
13af0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
13b00 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20  urnal.** (which 
13b10 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
13b20 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
13b30 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73  ) and drop locks
13b40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
13b50 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
13b60 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
13b70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13b80 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
13b90 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
13ba0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
13bb0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
13bc0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
13bd0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
13be0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a  eTwo(Btree *p){.
13bf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13c00 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
13c10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13c20 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
13c30 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74  ->db;.  btreeInt
13c40 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
13c50 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
13c60 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
13c70 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
13c80 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
13c90 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
13ca0 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
13cb0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
13cc0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
13cd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
13ce0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
13cf0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
13d00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
13d10 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13d20 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
13d30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
13d40 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
13d50 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
13d60 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
13d70 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
13d80 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
13d90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13da0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13db0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
13dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13dd0 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
13de0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
13df0 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e  _READ;.    pBt->
13e00 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  inStmt = 0;.  }.
13e10 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65    unlockAllTable
13e20 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  s(p);..  /* If t
13e30 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e  he handle has an
13e40 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
13e50 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
13e60 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61  ement the transa
13e70 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74  ction.  ** count
13e80 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
13e90 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
13ea0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72  nsaction count r
13eb0 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20  eaches 0, set.  
13ec0 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74  ** the shared st
13ed0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
13ee0 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
13ef0 65 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c  eeIfUnused() cal
13f00 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c  l below.  ** wil
13f10 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
13f20 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
13f30 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
13f40 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74  _NONE ){.    pBt
13f50 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
13f60 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
13f70 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
13f80 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
13f90 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
13fa0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
13fb0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
13fc0 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74   handles current
13fd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
13fe0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
13ff0 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a   and unlock.  **
14000 20 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68   the pager if th
14010 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
14020 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
14030 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
14040 6e 2e 0a 20 20 2a 2f 0a 20 20 62 74 72 65 65 43  n..  */.  btreeC
14050 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
14060 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  Bt);.  p->inTran
14070 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
14080 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
14090 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62  nused(pBt);..  b
140a0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
140b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
140c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
140d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
140e0 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
140f0 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
14100 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
14110 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
14120 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
14130 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14140 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
14150 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14160 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
14170 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
14180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
14190 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
141a0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29  ommitPhaseTwo(p)
141b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
141c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
141d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
141e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
141f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
14200 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
14210 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
14220 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
14230 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
14240 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
14250 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
14260 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
14270 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
14280 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
14290 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
142a0 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
142b0 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  e, a write-curso
142c0 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
142d0 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
142e0 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f  le of writing to
142f0 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54   the databse.  T
14300 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75  hat means the cu
14310 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67  rsor was.** orig
14320 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  inally opened fo
14330 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68  r writing and th
14340 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
14350 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20   be disabled.** 
14360 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74  by having its st
14370 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43  ate changed to C
14380 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a  URSOR_FAULT..*/.
14390 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
143a0 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
143b0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
143c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
143d0 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
143e0 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
143f0 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
14400 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
14410 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
14420 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ag && pCur->eSta
14430 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
14440 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
14450 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
14460 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
14470 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
14480 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
14490 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
144a0 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
144b0 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
144c0 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
144d0 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
144e0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
144f0 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
14500 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
14510 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
14520 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
14530 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
14540 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
14550 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
14560 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
14570 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
14580 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14590 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
145a0 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
145b0 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
145c0 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
145d0 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
145e0 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
145f0 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
14600 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
14610 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
14620 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
14630 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
14640 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
14650 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
14660 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
14670 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
14680 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
14690 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
146a0 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
146b0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
146c0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
146d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
146e0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
146f0 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
14700 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
14710 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
14720 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
14730 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
14740 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
14750 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
14760 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
14770 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
14780 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
14790 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
147a0 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
147b0 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d  T;.    p->skip =
147c0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f   errCode;.    fo
147d0 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
147e0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
147f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
14800 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
14810 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
14820 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
14830 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14840 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
14850 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
14860 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
14870 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
14880 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
14890 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
148a0 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
148b0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
148c0 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
148d0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
148e0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
148f0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
14900 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
14910 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
14920 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
14930 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
14940 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14950 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
14960 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
14970 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
14980 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
14990 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
149a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
149b0 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
149c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
149d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
149e0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
149f0 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
14a00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14a10 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
14a20 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73 61 76  ->db;.  rc = sav
14a30 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
14a40 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
14a50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14a60 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72  ED_CACHE.  if( r
14a70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14a80 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
14a90 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74   horrible situat
14aa0 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61  ion. An IO or ma
14ab0 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
14ac0 75 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  ured whilst.    
14ad0 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
14ae0 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
14af0 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
14b00 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
14b10 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
14b20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
14b30 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
14b40 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
14b50 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
14b60 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
14b70 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
14b80 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
14b90 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
14ba0 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
14bb0 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
14bc0 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
14bd0 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
14be0 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
14bf0 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
14c00 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
14c10 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
14c20 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
14c30 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
14c40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
14c50 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
14c60 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a  Cursors(p, rc);.
14c70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
14c80 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14c90 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65    unlockAllTable
14ca0 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  s(p);..  if( p->
14cb0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
14cc0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
14cd0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
14ce0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
14cf0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14d00 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
14d10 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
14d20 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
14d30 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
14d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14d50 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
14d60 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
14d70 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
14d80 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
14d90 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
14da0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
14db0 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
14dc0 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
14dd0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
14de0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
14df0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
14e00 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
14e10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
14e20 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
14e30 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
14e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14e50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14e60 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
14e70 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
14e80 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
14e90 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
14ea0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
14eb0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
14ec0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
14ed0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
14ee0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
14ef0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
14f00 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
14f10 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
14f20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
14f30 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
14f40 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
14f50 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
14f60 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
14f70 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
14f80 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70  ontent(pBt);.  p
14f90 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
14fa0 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
14fb0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
14fc0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
14fd0 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
14fe0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
14ff0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15000 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
15010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
15020 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
15030 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
15040 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
15050 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72   can.** can be r
15060 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70  olled back indep
15070 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
15080 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
15090 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74  ..** You must st
150a0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
150b0 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  n before startin
150c0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
150d0 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72  on..** The subtr
150e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
150f0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
15100 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
15110 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d  nsaction.** comm
15120 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
15130 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e  k..**.** Only on
15140 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
15150 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61   may be active a
15160 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73  t a time.  It is
15170 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79   an error to try
15180 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e  .** to start a n
15190 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ew subtransactio
151a0 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62  n if another sub
151b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
151c0 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
151d0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
151e0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
151f0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
15200 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
15210 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
15220 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
15230 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
15240 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
15250 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
15260 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
15270 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
15280 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
15290 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
152a0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
152b0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
152c0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
152d0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
152e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
152f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15300 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
15310 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
15320 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15330 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
15340 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15350 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
15360 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
15370 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15380 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
15390 65 72 74 28 20 21 70 42 74 2d 3e 69 6e 53 74 6d  ert( !pBt->inStm
153a0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
153b0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
153c0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
153d0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
153e0 5f 57 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 69  _WRITE || pBt->i
153f0 6e 53 74 6d 74 20 7c 7c 20 70 42 74 2d 3e 72 65  nStmt || pBt->re
15400 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72  adOnly) ){.    r
15410 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
15420 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NAL;.  }else{.  
15430 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
15440 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
15450 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
15460 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
15470 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
15480 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
15490 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
154a0 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  ith.    ** an in
154b0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
154c0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
154d0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
154e0 6c 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ly using.    ** 
154f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
15500 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
15510 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
15520 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
15530 20 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70     ** such savep
15540 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
15550 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
15560 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
15570 69 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a  is active..    *
15580 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
15590 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
155a0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
155b0 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
155c0 69 6e 74 2b 31 29 3b 0a 20 20 20 20 70 42 74 2d  int+1);.    pBt-
155d0 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
155e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
155f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
15610 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65  ommit the statme
15620 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
15630 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
15640 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a  rogress.  If no.
15650 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ** subtransactio
15660 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 69  n is active, thi
15670 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  s is a no-op..*/
15680 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15690 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65  eCommitStmt(Btre
156a0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
156b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
156c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
156d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
156e0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
156f0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
15700 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  pBt->readOnly==0
15710 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
15720 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74  nStmt ){.    int
15730 20 69 53 74 6d 74 70 6f 69 6e 74 20 3d 20 70 2d   iStmtpoint = p-
15740 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  >db->nSavepoint;
15750 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15760 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
15770 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 41 56  pBt->pPager, SAV
15780 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
15790 69 53 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20 7d  iStmtpoint);.  }
157a0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
157b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
157c0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
157d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
157e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
157f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
15800 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69  ollback the acti
15810 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  ve statement sub
15820 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
15830 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69   no subtransacti
15840 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20  on.** is active 
15850 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15860 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41  a no-op..**.** A
15870 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
15880 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  be invalidated b
15890 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
158a0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a  .  Any attempt.*
158b0 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  * to use a curso
158c0 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  r that was open 
158d0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
158e0 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
158f0 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c  on.** will resul
15900 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
15910 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15920 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42  eeRollbackStmt(B
15930 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
15940 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15950 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15960 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
15970 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15980 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
15990 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
159a0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
159b0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
159c0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Stmt ){.    int 
159d0 69 53 74 6d 74 70 6f 69 6e 74 20 3d 20 70 2d 3e  iStmtpoint = p->
159e0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  db->nSavepoint;.
159f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15a00 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
15a10 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 41 56 45  Bt->pPager, SAVE
15a20 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
15a30 69 53 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20 20  iStmtpoint);.   
15a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15a50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
15a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
15a70 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
15a80 65 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  er, SAVEPOINT_RE
15a90 4c 45 41 53 45 2c 20 69 53 74 6d 74 70 6f 69 6e  LEASE, iStmtpoin
15aa0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  t);.    }.    pB
15ab0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
15ac0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
15ad0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15ae0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15af0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
15b00 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
15b10 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
15b20 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
15b30 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
15b40 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
15b50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
15b60 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
15b70 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
15b80 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
15b90 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
15ba0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
15bb0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
15bc0 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
15bd0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
15be0 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
15bf0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
15c00 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
15c10 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
15c20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
15c30 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
15c40 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
15c50 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
15c60 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
15c70 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
15c80 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
15c90 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
15ca0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
15cb0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
15cc0 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
15cd0 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
15ce0 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
15cf0 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
15d00 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
15d10 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
15d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
15d30 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
15d40 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
15d50 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
15d60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15d70 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
15d80 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
15d90 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
15da0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15db0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
15dc0 74 2d 3e 69 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  t->inStmt==0 );.
15dd0 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
15de0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
15df0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
15e00 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
15e10 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
15e20 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
15e30 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
15e40 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
15e50 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
15e60 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15e70 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  p);.    pBt->db 
15e80 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 72 63 20  = p->db;.    rc 
15e90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
15ea0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
15eb0 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
15ec0 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
15ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15ee0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
15ef0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
15f00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
15f10 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
15f20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15f30 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
15f40 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
15f50 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
15f60 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
15f70 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68  e.** iTable.  Th
15f80 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69  e act of acquiri
15f90 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73  ng a cursor gets
15fa0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
15fb0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
15fc0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
15fd0 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
15fe0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
15ff0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
16000 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
16010 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
16020 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
16030 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
16040 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
16050 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
16060 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
16070 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
16080 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
16090 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
160a0 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
160b0 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
160c0 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
160d0 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
160e0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
160f0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
16100 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
16110 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
16120 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16130 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
16140 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
16150 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
16160 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
16170 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
16180 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
16190 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
161a0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
161b0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
161c0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
161d0 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
161e0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
161f0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
16200 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
16210 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
16220 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
16230 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
16240 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16250 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
16260 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
16270 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
16280 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
16290 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
162a0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
162b0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
162c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
162d0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
162e0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
162f0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
16300 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
16310 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
16320 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
16330 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
16340 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
16350 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
16360 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
16370 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
16380 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
16390 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20  reeCursorSize() 
163a0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
163b0 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  .** pointed to b
163c0 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e  y pCur have been
163d0 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63   zeroed by the c
163e0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
163f0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
16400 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16430 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
16440 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16460 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
16470 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
16480 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
16490 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
164b0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
164c0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
164d0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
164e0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
164f0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
16500 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
16510 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
16520 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16540 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
16550 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
16560 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16570 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74 53  gno nPage;.  BtS
16580 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16590 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
165a0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
165b0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
165c0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
165d0 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
165e0 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
165f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
16600 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
16610 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 42 74     if( NEVER(pBt
16620 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
16630 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16640 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
16650 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b   }.    if( check
16660 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61  ReadLocks(p, iTa
16670 62 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  ble, 0, 0) ){.  
16680 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16690 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a  E_LOCKED;.    }.
166a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e    }..  if( pBt->
166b0 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pPage1==0 ){.   
166c0 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57   rc = lockBtreeW
166d0 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20  ithRetry(p);.   
166e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
166f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
16700 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
16710 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
16720 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
16730 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16740 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
16750 42 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74  Bt->pPager, (int
16760 20 2a 29 26 6e 50 61 67 65 29 3b 20 0a 20 20 69   *)&nPage); .  i
16770 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16780 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
16790 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  c;.  }.  if( iTa
167a0 62 6c 65 3d 3d 31 20 26 26 20 6e 50 61 67 65 3d  ble==1 && nPage=
167b0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
167c0 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20  QLITE_EMPTY;.   
167d0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
167e0 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
167f0 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
16800 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
16810 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
16820 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b  Cur->apPage[0]);
16830 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
16850 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
16860 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  xception;.  }.. 
16870 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
16880 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
16890 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
168a0 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
168b0 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
168c0 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20  ables, link the 
168d0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
168e0 42 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e  BtShared list an
168f0 64 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68  d set *ppCur (th
16900 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72  e.  ** output ar
16910 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
16920 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20  unction)..  */. 
16930 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
16940 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
16950 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
16960 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
16970 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  t;.  pCur->wrFla
16980 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a  g = (u8)wrFlag;.
16990 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
169a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
169b0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
169c0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
169d0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
169e0 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
169f0 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
16a00 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
16a10 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a 20  RSOR_INVALID;.. 
16a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16a30 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f  K;..create_curso
16a40 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72  r_exception:.  r
16a50 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
16a60 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 75  >apPage[0]);.  u
16a70 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
16a80 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ed(pBt);.  retur
16a90 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
16aa0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
16ab0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ae0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
16af0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16b20 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
16b30 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
16b40 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
16b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
16b70 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
16b80 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
16b90 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
16ba0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
16bb0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
16bc0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
16bd0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
16be0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
16c10 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
16c20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
16c30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16c40 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
16c50 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
16c60 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
16c70 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
16c80 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
16c90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16ca0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16cb0 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
16cc0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
16cd0 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ze(){.  return s
16ce0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b  izeof(BtCursor);
16cf0 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  .}..../*.** Clos
16d00 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
16d10 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
16d20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16d30 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
16d40 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
16d50 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
16d60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16d70 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
16d80 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
16d90 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
16da0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
16db0 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
16dc0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
16dd0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
16de0 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
16df0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16e00 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42 74 2d  Btree);.    pBt-
16e10 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  >db = pBtree->db
16e20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
16e30 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
16e40 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
16e50 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
16e60 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
16e70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
16e80 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
16e90 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
16ea0 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
16eb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16ec0 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
16ed0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
16ee0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
16ef0 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
16f00 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
16f10 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
16f20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
16f30 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
16f40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
16f50 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
16f60 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
16f70 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
16f80 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
16f90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
16fa0 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
16fb0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
16fc0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
16fd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16fe0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  ../*.** Make a t
16ff0 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
17000 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  by filling in th
17010 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d  e fields of pTem
17020 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d  pCur..** The tem
17030 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73  porary cursor is
17040 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73   not on the curs
17050 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  or list for the 
17060 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Btree..*/.void s
17070 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65  qlite3BtreeGetTe
17080 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
17090 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f  r *pCur, BtCurso
170a0 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20  r *pTempCur){.  
170b0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
170c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
170d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d  x(pCur) );.  mem
170e0 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43  cpy(pTempCur, pC
170f0 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75 72  ur, sizeof(BtCur
17100 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  sor));.  pTempCu
17110 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
17120 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
17130 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
17140 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50 61  i<=pTempCur->iPa
17150 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ge; i++){.    sq
17160 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54  lite3PagerRef(pT
17170 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  empCur->apPage[i
17180 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ]->pDbPage);.  }
17190 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 6d 70  .  assert( pTemp
171a0 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a  Cur->pKey==0 );.
171b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
171c0 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
171d0 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d  or such as was m
171e0 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74  ade by the Creat
171f0 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72  eTemporaryCursor
17200 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  ().** function a
17210 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  bove..*/.void sq
17220 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
17230 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  eTempCursor(BtCu
17240 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
17250 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
17260 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
17270 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f 72 28  (pCur) );.  for(
17280 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
17290 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  age; i++){.    s
172a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
172b0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
172c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
172d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
172e0 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 2f  Cur->pKey);.}../
172f0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
17300 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
17310 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
17320 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
17330 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
17340 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
17350 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
17360 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
17370 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
17380 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
17390 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
173a0 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
173b0 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
173c0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
173d0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
173e0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
173f0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
17400 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
17410 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
17420 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
17430 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
17440 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
17450 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
17460 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
17470 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
17480 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
17490 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
174a0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
174b0 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
174c0 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
174d0 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
174e0 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
174f0 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
17500 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
17510 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
17520 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
17530 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
17540 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
17550 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
17560 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
17570 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
17580 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
17590 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
175a0 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
175b0 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
175c0 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
175d0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
175e0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
175f0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
17600 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
17610 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
17620 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
17630 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
17640 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
17650 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
17660 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
17670 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
17680 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
17690 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
176a0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
176b0 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
176c0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
176d0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
176e0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
176f0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
17700 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
17710 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
17720 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
17730 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
17740 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
17750 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
17760 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
17770 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
17780 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
17790 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
177a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
177b0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
177c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
177d0 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ge;.      sqlite
177e0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
177f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
17800 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
17810 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
17820 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
17830 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
17840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17850 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
17860 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
17870 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
17880 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
17890 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
178a0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
178b0 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
178c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
178d0 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
178e0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
178f0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
17930 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
17940 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17970 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
17980 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
17990 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73           \.    s
179d0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
179e0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
179f0 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
17a00 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
17a10 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20  r->info); \.    
17a20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
17a30 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
17a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
17a70 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
17ac0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
17ad0 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
17b10 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
17b20 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  C_VER */../*.** 
17b30 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
17b40 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
17b50 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
17b60 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
17b70 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
17b80 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
17b90 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
17ba0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
17bb0 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
17bc0 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
17bd0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
17be0 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
17bf0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
17c00 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
17c10 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
17c20 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
17c30 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
17c40 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
17c50 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
17c60 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
17c70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
17c80 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
17c90 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
17ca0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
17cb0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
17cc0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
17cd0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
17ce0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17cf0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
17d00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
17d10 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
17d20 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
17d30 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
17d40 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
17d50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
17d60 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70  ALID ){.      *p
17d70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
17d80 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
17d90 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
17da0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
17db0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
17dc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17dd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
17de0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
17df0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17e00 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
17e10 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
17e20 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
17e30 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20  nts to.  Always 
17e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17e50 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  ..** Failure is 
17e60 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49  not possible.  I
17e70 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
17e80 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  not currently.**
17e90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20   pointing to an 
17ea0 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61 6e  entry (which can
17eb0 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
17ec0 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20  mple, if.** the 
17ed0 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
17ee0 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69  y) then *pSize i
17ef0 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  s set to 0..*/.i
17f00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
17f10 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
17f20 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
17f30 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
17f40 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
17f50 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
17f60 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
17f70 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
17f80 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
17f90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17fa0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
17fb0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17fc0 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
17fd0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17fe0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
17ff0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
18000 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
18010 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f  .      /* Not po
18020 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69  inting at a vali
18030 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70  d entry - set *p
18040 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20  Size to 0. */.  
18050 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
18060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18070 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
18080 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
18090 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
180a0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
180b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
180c0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
180d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
180e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
180f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
18100 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
18110 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
18120 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
18130 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
18140 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
18150 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
18160 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
18170 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
18180 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
18190 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
181a0 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
181b0 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
181c0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
181d0 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
181e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
181f0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
18200 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
18210 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
18220 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
18230 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
18240 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
18250 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
18260 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
18270 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
18280 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
18290 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
182a0 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
182b0 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
182c0 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
182d0 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
182e0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
182f0 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
18300 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
18310 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
18320 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
18330 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
18340 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
18350 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
18360 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
18370 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
18380 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
18390 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
183a0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
183b0 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
183c0 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
183d0 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
183e0 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
183f0 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
18400 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
18410 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
18420 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
18430 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
18440 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
18450 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
18460 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
18470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
18480 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
18490 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
184a0 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
184c0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
184d0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
184e0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
184f0 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
18500 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
18510 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
18520 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
18530 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
18540 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
18550 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
18560 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
18570 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
18580 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
18590 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
185a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
185b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
185c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
185d0 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
185e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
185f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
18600 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
18610 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
18620 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
18630 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
18640 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
18650 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
18660 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
18670 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
18680 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
18690 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
186a0 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
186b0 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
186c0 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
186d0 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
186e0 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
186f0 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
18700 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
18710 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
18720 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
18730 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
18740 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
18750 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
18760 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
18770 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
18780 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
18790 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
187a0 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
187b0 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
187c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
187d0 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
187e0 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
187f0 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65  if( iGuess<=page
18800 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
18810 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
18820 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
18830 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
18840 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
18850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18860 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
18870 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
18880 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
18890 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
188a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
188b0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
188c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
188d0 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  if..  if( rc==SQ
188e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
188f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18900 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
18910 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  l, &pPage, 0);. 
18920 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51     assert(rc==SQ
18930 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
18940 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ==0);.    if( ne
18950 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  xt==0 && rc==SQL
18960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18970 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
18980 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
18990 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
189a0 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
189b0 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
189c0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
189d0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
189e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
189f0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
18a00 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
18a10 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
18a20 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
18a30 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
18a40 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
18a50 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
18a60 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
18a70 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
18a80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
18a90 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
18aa0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
18ab0 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
18ac0 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
18ad0 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
18ae0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
18af0 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
18b00 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
18b10 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
18b20 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
18b30 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
18b40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
18b50 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
18b60 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
18b70 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
18b80 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
18b90 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
18ba0 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
18bb0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
18bc0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
18bd0 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
18be0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
18bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
18c00 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
18c10 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
18c20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
18c30 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
18c40 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c60 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
18c70 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
18c80 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
18c90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18ca0 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
18cb0 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18cd0 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
18ce0 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
18cf0 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
18d00 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
18d10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
18d20 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
18d30 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
18d40 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
18d50 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
18d60 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
18d70 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
18d80 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
18d90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
18da0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
18db0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18dc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18dd0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
18de0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
18df0 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
18e00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
18e10 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
18e20 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
18e30 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
18e40 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
18e50 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
18e60 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
18e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18e80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18e90 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
18ea0 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
18eb0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
18ec0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
18ed0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
18ee0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
18ef0 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
18f00 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
18f10 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
18f20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
18f30 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
18f40 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
18f50 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
18f60 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
18f70 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
18f80 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
18f90 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
18fa0 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
18fb0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
18fc0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
18fd0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
18fe0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
18ff0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
19000 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
19010 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
19020 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63  t make a distinc
19030 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79  tion between key
19040 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74   and data..** It
19050 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77   just reads or w
19060 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d  rites bytes from
19070 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65   the payload are
19080 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a  a.  Data might .
19090 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ** appear on the
190a0 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
190b0 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
190c0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
190d0 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a  low .** pages..*
190e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
190f0 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
19100 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
19110 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
19120 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
19130 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
19140 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
19150 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
19160 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
19170 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
19180 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
19190 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
191a0 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
191b0 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
191c0 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
191d0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
191e0 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
191f0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
19200 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
19210 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
19220 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
19230 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
19240 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
19250 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
19260 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
19270 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
19280 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
19290 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
192a0 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
192b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
192c0 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
192d0 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
192e0 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
192f0 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
19300 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
19310 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
19320 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
19330 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
19340 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
19350 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
19360 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
19370 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
19380 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
19390 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
193a0 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
193b0 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
193c0 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
193d0 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
193e0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
193f0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
19400 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
19410 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
19420 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
19430 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
19440 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
19450 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
19460 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
19470 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
19480 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
19490 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
194a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
194b0 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
194c0 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
194d0 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
194e0 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20  int skipKey,    
194f0 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62       /* offset b
19500 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66  egins at data if
19510 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
19520 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
19530 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
19540 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
19550 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
19560 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
19570 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
19580 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19590 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
195a0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
195b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
195c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
195d0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
195e0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
195f0 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
19600 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19610 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19630 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
19640 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
19650 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
19670 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19680 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
19690 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
196a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
196b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
196c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
196d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
196e0 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
196f0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
19700 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
19710 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
19720 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
19730 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
19740 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
19750 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
19760 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79  ;..  if( skipKey
19770 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b   ){.    offset +
19780 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  = nKey;.  }.  if
19790 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  ( offset+amt > n
197a0 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
197b0 44 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61  Data .   || &aPa
197c0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
197d0 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
197e0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
197f0 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20  ableSize].  ){. 
19800 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
19810 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
19820 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
19830 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
19840 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
19850 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
19860 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
19870 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
19880 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
19890 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
198a0 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
198b0 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
198c0 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
198d0 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
198e0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
198f0 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
19900 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
19910 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
19920 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
19930 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
19940 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
19950 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
19960 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
19970 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
19980 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
19990 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
199a0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
199b0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
199c0 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
199d0 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
199e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
199f0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
19a00 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
19a10 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
19a20 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
19a30 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
19a40 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
19a50 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
19a60 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
19a70 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
19a80 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
19a90 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65  Local]);..#ifnde
19aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
19ab0 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66  CRBLOB.    /* If
19ac0 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48   the isIncrblobH
19ad0 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
19ae0 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73  t and the BtCurs
19af0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20  or.aOverflow[]. 
19b00 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
19b10 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
19b20 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  locate it now. T
19b30 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  he array is size
19b40 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  d at.    ** one 
19b50 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
19b60 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
19b70 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
19b80 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  in. The.    ** p
19b90 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
19ba0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
19bb0 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
19bc0 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
19bd0 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76  .    ** etc. A v
19be0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
19bf0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
19c00 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ay means "not ye
19c10 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20  t known".    ** 
19c20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
19c30 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
19c40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19c50 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
19c60 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d  Handle && !pCur-
19c70 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
19c80 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
19c90 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
19ca0 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
19cb0 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
19cc0 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
19cd0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
19ce0 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
19cf0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
19d00 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66  izeof(Pgno)*nOvf
19d10 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  l);.      if( nO
19d20 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  vfl && !pCur->aO
19d30 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
19d40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19d50 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
19d60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
19d70 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
19d80 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
19d90 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
19da0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
19db0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
19dc0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
19dd0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
19de0 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
19df0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
19e00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
19e10 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
19e20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
19e30 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
19e40 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
19e50 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
19e60 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
19e70 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
19e80 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
19e90 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
19ea0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
19eb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
19ec0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
19ed0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
19ee0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
19ef0 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
19f00 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
19f10 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
19f20 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
19f30 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
19f40 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
19f50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
19f60 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
19f70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
19f80 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
19f90 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
19fa0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
19fb0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
19fc0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
19fd0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
19fe0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
19ff0 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
1a000 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
1a010 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1a020 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
1a030 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1a040 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
1a050 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1a060 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1a070 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1a080 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
1a090 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
1a0a0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
1a0b0 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
1a0c0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
1a0d0 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
1a0e0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
1a0f0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
1a100 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
1a110 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
1a120 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
1a130 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
1a140 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
1a150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1a160 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
1a170 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1a180 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1a190 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
1a1a0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
1a1b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1a1c0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
1a1d0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
1a1e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
1a1f0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
1a200 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
1a210 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
1a220 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
1a230 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
1a240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a250 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
1a260 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
1a270 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
1a280 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
1a290 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
1a2a0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
1a2b0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
1a2c0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
1a2d0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
1a2e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62     */.        Db
1a2f0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
1a300 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
1a310 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mt;.        rc =
1a320 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1a330 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
1a340 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
1a350 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1a360 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a370 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
1a380 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
1a390 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
1a3a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
1a3b0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1a3c0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
1a3d0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
1a3e0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
1a3f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
1a400 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
1a410 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
1a420 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1a430 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1a440 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
1a450 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1a460 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1a470 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1a480 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
1a490 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
1a4a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1a4b0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
1a4c0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1a4d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a4e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1a4f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a500 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1a510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1a520 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1a530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a540 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
1a550 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
1a560 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
1a570 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
1a580 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
1a590 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
1a5a0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
1a5b0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
1a5c0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
1a5d0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
1a5e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1a5f0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
1a600 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
1a610 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1a620 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
1a630 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
1a640 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
1a650 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
1a660 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
1a670 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a680 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
1a690 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
1a6a0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
1a6b0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
1a6c0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1a6d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1a6e0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1a6f0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1a700 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1a710 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a720 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1a730 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a740 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1a750 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1a760 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
1a770 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1a780 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66  iPage] );.    if
1a790 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
1a7a0 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
1a7b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a7c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1a7d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a7e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1a7f0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
1a800 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1a810 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
1a820 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
1a830 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
1a840 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
1a850 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c  d char*)pBuf, 0,
1a860 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1a870 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1a880 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1a890 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
1a8a0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1a8b0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1a8c0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1a8d0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1a8e0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1a8f0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1a900 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1a910 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1a920 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1a930 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1a940 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1a950 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1a960 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1a970 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1a980 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1a990 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1a9a0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1a9b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1a9c0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
1a9d0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
1a9e0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
1a9f0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
1aa00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1aa10 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1aa20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
1aa30 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1aa40 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1aa50 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
1aa60 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1aa70 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1aa80 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1aa90 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1aaa0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1aab0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1aac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1aad0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1aae0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1aaf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ab00 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1ab10 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1ab20 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1ab30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ab40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1ab50 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1ab60 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1ab70 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
1ab80 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
1ab90 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
1aba0 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20   pBuf, 1, 0);.  
1abb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1abc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1abd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
1abe0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
1abf0 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
1ac00 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
1ac10 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1ac20 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
1ac30 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
1ac40 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
1ac50 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
1ac60 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
1ac70 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
1ac80 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
1ac90 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
1aca0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1acb0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
1acc0 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
1acd0 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
1ace0 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
1acf0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1ad00 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
1ad10 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
1ad20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
1ad30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1ad40 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
1ad50 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
1ad60 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
1ad70 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
1ad80 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
1ad90 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
1ada0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
1adb0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
1adc0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
1add0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1ade0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
1adf0 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
1ae00 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
1ae10 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
1ae20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
1ae30 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
1ae40 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
1ae50 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
1ae60 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
1ae70 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
1ae80 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65  sembly.** the ke
1ae90 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
1aea0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
1aeb0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
1aec0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
1aed0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
1aee0 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
1aef0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
1af00 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
1af10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1af20 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
1af30 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
1af40 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
1af50 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
1af60 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
1af70 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1af80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
1af90 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
1afa0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1afb0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1afc0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1afd0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1afe0 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
1aff0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1b000 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
1b010 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
1b020 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
1b030 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
1b040 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
1b050 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
1b060 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
1b070 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1b080 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
1b090 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
1b0a0 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61  Key;.  u32 nLoca
1b0b0 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
1b0c0 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
1b0d0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1b0e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1b0f0 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
1b100 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1b110 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1b120 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1b130 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1b140 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1b150 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1b160 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
1b170 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1b180 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1b190 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74  ->nCell );.  get
1b1a0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1b1b0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
1b1c0 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20  r->info.pCell;. 
1b1d0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75   aPayload += pCu
1b1e0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
1b1f0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
1b200 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
1b210 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1b220 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70     nKey = (int)p
1b230 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1b240 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
1b250 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
1b260 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
1b270 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1b280 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
1b290 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1b2a0 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
1b2b0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69  fo.nLocal;.    i
1b2c0 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29  f( nLocal>nKey )
1b2d0 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
1b2e0 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d   nKey;.    }.  }
1b2f0 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
1b300 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
1b310 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
1b320 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
1b330 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
1b340 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
1b350 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
1b360 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
1b370 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
1b380 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
1b390 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
1b3a0 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
1b3b0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1b3c0 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
1b3d0 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
1b3e0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1b3f0 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
1b400 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
1b410 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
1b420 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
1b430 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
1b440 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
1b450 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
1b460 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
1b470 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
1b480 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
1b490 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
1b4a0 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
1b4b0 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
1b4c0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
1b4d0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1b4e0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
1b4f0 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
1b500 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
1b510 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
1b520 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
1b530 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
1b540 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1b550 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
1b560 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
1b570 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
1b580 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1b590 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
1b5a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1b5b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b5c0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1b5d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1b5e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
1b5f0 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
1b600 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
1b610 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
1b620 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn 0;.}.const v
1b630 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
1b640 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
1b650 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1b660 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28  pAmt){.  assert(
1b670 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1b680 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
1b690 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1b6a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1b6b0 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
1b6c0 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
1b6d0 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
1b6e0 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
1b6f0 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   0;.}.../*.** Mo
1b700 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1b710 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
1b720 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
1b730 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
1b740 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
1b750 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
1b760 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
1b770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b780 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
1b790 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1b7a0 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
1b7b0 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
1b7c0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
1b7d0 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
1b7e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b7f0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
1b800 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b810 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1b830 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1b840 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1b850 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
1b860 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
1b870 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  TH );.  if( pCur
1b880 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
1b890 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
1b8a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1b8b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1b8c0 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
1b8d0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1b8e0 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
1b8f0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1b900 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
1b910 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d  Cur->apPage[i+1]
1b920 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
1b930 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20  Cur->aiIdx[i+1] 
1b940 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
1b950 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ge++;..  pCur->i
1b960 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1b970 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1b980 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
1b990 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b  Page->nCell<1 ){
1b9a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b9b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1b9c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1b9d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
1b9e0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
1b9f0 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
1ba00 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
1ba10 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
1ba20 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1ba30 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
1ba40 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
1ba50 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
1ba60 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
1ba70 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
1ba80 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
1ba90 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
1baa0 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
1bab0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
1bac0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
1bad0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
1bae0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
1baf0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
1bb00 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
1bb10 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1bb20 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
1bb30 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
1bb40 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
1bb50 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ild){.  assert( 
1bb60 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
1bb70 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
1bb80 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
1bb90 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
1bba0 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
1bbb0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
1bbc0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
1bbd0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1bbe0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1bbf0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
1bc00 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
1bc10 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
1bc20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
1bc30 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
1bc40 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
1bc50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
1bc60 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
1bc70 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
1bc80 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
1bc90 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
1bca0 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
1bcb0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
1bcc0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
1bcd0 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
1bce0 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
1bcf0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1bd00 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
1bd10 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
1bd20 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
1bd30 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
1bd40 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
1bd50 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
1bd60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1bd70 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1bd80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1bd90 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1bda0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1bdb0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1bdc0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1bdd0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1bde0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
1bdf0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
1be00 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1be10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1be20 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
1be30 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
1be40 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1be50 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
1be60 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1be70 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
1be80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1be90 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
1bea0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1beb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1bec0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75  ->iPage]);.  pCu
1bed0 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43  r->iPage--;.  pC
1bee0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1bef0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1bf00 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  dNKey = 0;.}../*
1bf10 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1bf20 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  sor to the root 
1bf30 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  page.*/.static i
1bf40 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
1bf50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1bf60 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
1bf70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1bf80 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
1bf90 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
1bfa0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1bfb0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
1bfc0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1bfd0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1bfe0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1bff0 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
1c000 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1c010 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
1c020 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
1c030 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1c040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1c050 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
1c060 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1c070 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1c080 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
1c090 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
1c0a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1c0b0 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
1c0c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c0d0 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20   pCur->skip;.   
1c0e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1c0f0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1c100 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
1c110 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1c120 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1c130 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43    for(i=1; i<=pC
1c140 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1c150 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1c160 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1c170 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  i]);.    }.  }el
1c180 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20  se{.    if( .   
1c190 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
1c1a0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1c1b0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
1c1c0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
1c1d0 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29  pPage[0])).    )
1c1e0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
1c1f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1c200 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
1c210 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1c220 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  }..  pRoot = pCu
1c230 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
1c240 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
1c250 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
1c260 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  oot );.  pCur->i
1c270 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Page = 0;.  pCur
1c280 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
1c290 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1c2a0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1c2b0 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
1c2c0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1c2d0 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0;..  if( pRoot-
1c2e0 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
1c2f0 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
1c300 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
1c310 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
1c320 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20  ->pgno==1 );.   
1c330 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
1c340 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
1c350 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
1c360 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
1c370 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b  rt( subpage>0 );
1c380 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1c390 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
1c3a0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1c3b0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
1c3c0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
1c3d0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1c3e0 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c   = ((pRoot->nCel
1c3f0 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
1c400 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
1c410 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1c430 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1c440 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
1c450 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1c460 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
1c470 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
1c480 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1c490 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
1c4a0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
1c4b0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
1c4c0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
1c4d0 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
1c4e0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1c4f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1c500 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1c510 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1c520 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1c530 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c540 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
1c550 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1c560 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c570 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1c580 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1c590 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1c5a0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
1c5b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
1c5c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1c5d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c5e0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
1c5f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1c600 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1c610 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1c620 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1c630 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1c640 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
1c650 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
1c660 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1c670 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1c680 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c690 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1c6a0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1c6b0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
1c6c0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1c6d0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
1c6e0 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
1c6f0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1c700 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
1c710 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
1c720 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
1c730 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
1c740 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
1c750 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
1c760 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
1c770 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
1c780 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
1c790 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
1c7a0 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
1c7b0 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
1c7c0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1c7d0 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
1c7e0 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
1c7f0 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
1c800 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
1c810 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
1c820 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
1c830 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1c840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1c850 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
1c860 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1c870 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
1c880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c890 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1c8a0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
1c8b0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c8c0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1c8d0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1c8e0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1c8f0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1c900 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1c910 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1c920 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1c930 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
1c940 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
1c950 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1c960 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1c970 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
1c980 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1c990 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1c9a0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1c9b0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1c9c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c9d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c9e0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1c9f0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
1ca00 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
1ca10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1ca20 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
1ca30 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1ca40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ca50 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1ca60 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
1ca70 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1ca80 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1ca90 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1caa0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1cab0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1cac0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1cad0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1cae0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1caf0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1cb00 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1cb10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1cb20 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1cb30 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1cb40 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
1cb50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1cb60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1cb70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1cb80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1cb90 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1cba0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1cbb0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1cbc0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1cbd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cbe0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1cbf0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1cc00 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
1cc10 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1cc20 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1cc30 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
1cc40 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1cc50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cc60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cc70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1cc80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1cc90 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
1cca0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1ccb0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
1ccc0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1ccd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1cce0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1ccf0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1cd00 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1cd10 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1cd20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1cd30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
1cd40 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
1cd50 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
1cd60 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
1cd70 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
1cd80 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
1cd90 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1cda0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1cdb0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
1cdc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1cdd0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1cde0 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
1cdf0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1ce00 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1ce10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ce20 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1ce30 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1ce40 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
1ce50 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1ce60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ce70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
1ce80 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1ce90 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1cea0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ceb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1cec0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
1ced0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
1cee0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cef0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1cf00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1cf10 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
1cf20 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1cf30 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
1cf40 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1cf50 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1cf60 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ur);.      pCur-
1cf70 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51  >atLast = rc==SQ
1cf80 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20  LITE_OK ?1:0;.  
1cf90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1cfa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
1cfb0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
1cfc0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1cfd0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
1cfe0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
1cff0 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
1d000 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
1d010 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
1d020 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
1d030 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
1d040 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
1d050 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
1d060 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
1d070 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
1d080 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
1d090 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
1d0a0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
1d0b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
1d0c0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
1d0d0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
1d0e0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
1d0f0 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
1d100 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
1d110 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
1d120 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
1d130 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
1d140 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
1d150 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
1d160 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
1d170 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
1d180 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
1d190 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
1d1a0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1d1b0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
1d1c0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
1d1d0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
1d1e0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
1d1f0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
1d200 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
1d210 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
1d220 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
1d230 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
1d240 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
1d250 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
1d260 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
1d270 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1d280 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1d290 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1d2b0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
1d2c0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
1d2d0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1d2e0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
1d2f0 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
1d300 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
1d310 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
1d320 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
1d330 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
1d340 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1d350 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1d360 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1d370 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1d380 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
1d390 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
1d3a0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
1d3b0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
1d3c0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1d3d0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1d3e0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1d400 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
1d410 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
1d420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d430 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
1d440 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1d450 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
1d460 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
1d470 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
1d480 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
1d490 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
1d4a0 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
1d4b0 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
1d4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d4d0 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
1d4e0 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
1d4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1d500 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
1d510 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
1d520 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
1d530 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
1d540 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
1d550 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
1d560 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1d570 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d580 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d590 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1d5a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1d5b0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1d5c0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
1d5d0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
1d5e0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
1d5f0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
1d600 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
1d610 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
1d620 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
1d630 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
1d640 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
1d650 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1d660 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1d670 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  && pCur->validNK
1d680 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ey .   && pCur->
1d690 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
1d6a0 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
1d6b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
1d6c0 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
1d6d0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1d6e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d6f0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
1d700 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26  ( pCur->atLast &
1d710 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
1d720 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
1d730 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
1d740 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d750 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1d760 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1d770 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1d780 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1d790 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1d7a0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1d7b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1d7c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d7d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1d7e0 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ge]->isInit );. 
1d7f0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1d800 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1d810 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
1d820 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
1d830 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1d840 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1d850 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
1d860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d870 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
1d880 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1d890 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
1d8a0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
1d8b0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20   int lwr, upr;. 
1d8c0 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
1d8d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1d8e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1d8f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
1d900 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20      int c = -1; 
1d910 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20   /* pRes return 
1d920 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  if table is empt
1d930 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a  y must be -1 */.
1d940 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
1d950 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
1d960 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 28  ell-1;.    if( (
1d970 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  !pPage->intKey &
1d980 26 20 70 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c  & pIdxKey==0) ||
1d990 20 75 70 72 3c 30 20 29 7b 0a 20 20 20 20 20 20   upr<0 ){.      
1d9a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1d9b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1d9c0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1d9d0 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sh;.    }.    if
1d9e0 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
1d9f0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
1da00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1da10 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65  (u16)upr;.    }e
1da20 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
1da30 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1da40 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72  ge] = (u16)((upr
1da50 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +lwr)/2);.    }.
1da60 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
1da70 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
1da80 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65  y;.      i64 nCe
1da90 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74  llKey;.      int
1daa0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
1dab0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
1dac0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  .      pCur->inf
1dad0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1dae0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1daf0 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  ey = 1;.      if
1db00 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
1db10 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ){.        u8 *p
1db20 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Cell;.        pC
1db30 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1db40 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
1db50 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
1db60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1db70 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
1db80 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
1db90 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
1dba0 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
1dbb0 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79  t32(pCell, dummy
1dbc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1dbd0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
1dbe0 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
1dbf0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
1dc00 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  if( nCellKey==in
1dc10 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
1dc20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
1dc30 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
1dc40 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
1dc50 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
1dc60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dc70 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1dc80 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
1dc90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
1dca0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1dcb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dcc0 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62       int availab
1dcd0 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  le;.        pCel
1dce0 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66  lKey = (void *)f
1dcf0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1dd00 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29  , &available, 0)
1dd10 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b  ;.        nCellK
1dd20 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
1dd30 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nKey;.        if
1dd40 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65  ( available>=nCe
1dd50 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  llKey ){.       
1dd60 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
1dd70 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1dd80 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70  (int)nCellKey, p
1dd90 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
1dda0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1ddb0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  {.          pCel
1ddc0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
1ddd0 6c 6c 6f 63 28 20 28 69 6e 74 29 6e 43 65 6c 6c  lloc( (int)nCell
1dde0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1ddf0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
1de00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1de10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1de20 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
1de30 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1de40 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
1de50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1de60 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
1de70 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  ur, 0, (int)nCel
1de80 6c 4b 65 79 2c 20 28 76 6f 69 64 2a 29 70 43 65  lKey, (void*)pCe
1de90 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
1dea0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
1deb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 28  eRecordCompare((
1dec0 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  int)nCellKey, pC
1ded0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
1dee0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1def0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
1df00 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1df10 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
1df20 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
1df30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1df40 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
1df50 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
1df60 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
1df70 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
1df80 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
1df90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1dfa0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
1dfb0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
1dfc0 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
1dfd0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1dfe0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1dff0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
1e000 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
1e010 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1e020 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
1e030 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
1e040 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e050 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
1e060 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
1e070 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1e080 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
1e090 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
1e0a0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
1e0b0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
1e0c0 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
1e0d0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72  lKey;.        br
1e0e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1e0f0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1e100 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
1e110 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29  16)((lwr+upr)/2)
1e120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1e130 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29  rt( lwr==upr+1 )
1e140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1e150 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1e160 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1e170 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
1e180 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
1e190 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
1e1a0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
1e1b0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1e1c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1e1d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1e1e0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
1e1f0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1e200 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1e210 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
1e220 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
1e230 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
1e240 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e250 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1e260 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1e270 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1e280 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
1e290 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
1e2a0 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
1e2b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
1e2c0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1e2d0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
1e2e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1e2f0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
1e300 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1e310 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1e320 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1e330 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
1e340 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1e350 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
1e360 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
1e370 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
1e380 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
1e390 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e3a0 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
1e3b0 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
1e3c0 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
1e3d0 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
1e3e0 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
1e3f0 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
1e400 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1e410 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
1e420 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
1e430 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
1e440 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
1e450 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
1e460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e470 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
1e480 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1e490 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
1e4a0 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
1e4b0 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
1e4c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1e4d0 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
1e4e0 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
1e4f0 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
1e500 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
1e510 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
1e520 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
1e530 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
1e540 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
1e550 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
1e560 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
1e570 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
1e580 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
1e590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1e5a0 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
1e5b0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
1e5c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1e5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
1e5e0 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
1e5f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1e600 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
1e610 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
1e620 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1e630 6f 72 64 20 61 53 70 61 63 65 5b 31 36 5d 3b 20  ord aSpace[16]; 
1e640 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
1e650 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
1e660 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
1e670 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
1e680 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
1e690 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
1e6a0 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
1e6b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1e6c0 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
1e6d0 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
1e6e0 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20  Key, pKey,.     
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e710 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
1e720 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66  aSpace));.    if
1e730 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
1e740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1e750 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
1e760 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20   pIdxKey = 0;.  
1e770 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1e780 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
1e790 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65  ked(pCur, pIdxKe
1e7a0 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70  y, nKey, bias, p
1e7b0 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  Res);.  if( pKey
1e7c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1e7d0 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65  dbeDeleteUnpacke
1e7e0 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29  dRecord(pIdxKey)
1e7f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e800 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
1e810 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1e820 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1e830 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1e840 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
1e850 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
1e860 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
1e870 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
1e880 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
1e890 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
1e8a0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1e8b0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
1e8c0 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
1e8d0 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
1e8e0 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
1e8f0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
1e900 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
1e910 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1e920 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1e930 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
1e940 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
1e950 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
1e960 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
1e970 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
1e980 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
1e990 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
1e9a0 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
1e9b0 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
1e9c0 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
1e9d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
1e9e0 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
1e9f0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
1ea00 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
1ea10 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
1ea20 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
1ea30 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
1ea40 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
1ea50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
1ea60 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72  dle for a cursor
1ea70 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1ea80 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1ea90 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72 73 6f  Db(const BtCurso
1eaa0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
1eab0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1eac0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1ead0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1eae0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
1eaf0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a  ->pBtree->db;.}.
1eb00 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
1eb10 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1eb20 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
1eb30 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1eb40 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1eb50 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1eb60 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1eb70 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1eb80 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
1eb90 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1eba0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1ebb0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1ebc0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1ebd0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1ebe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ebf0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
1ec00 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1ec10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1ec20 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
1ec30 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
1ec40 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ec50 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ec60 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1ec70 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1ec80 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1ec90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1eca0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1ecb0 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
1ecc0 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
1ecd0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1ece0 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
1ecf0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1ed00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ed10 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1ed20 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
1ed30 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1ed40 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1ed50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ed60 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1ed70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
1ed80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1ed90 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
1eda0 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
1edb0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
1edc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1edd0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1ede0 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d  ert( idx<=pPage-
1edf0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
1ee00 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1ee10 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
1ee20 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
1ee30 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1ee40 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
1ee50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1ee60 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1ee70 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
1ee80 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1ee90 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1eea0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
1eeb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1eec0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1eed0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1eee0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1eef0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1ef00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
1ef10 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
1ef20 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
1ef30 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1ef40 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
1ef50 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1ef60 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
1ef70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ef80 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1ef90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1efa0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
1efb0 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
1efc0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1efd0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
1efe0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
1eff0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
1f000 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1f010 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1f020 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1f030 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  tKey ){.      rc
1f040 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
1f050 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
1f060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f070 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1f080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1f090 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52  rn rc;.  }.  *pR
1f0a0 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  es = 0;.  if( pP
1f0b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1f0c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f0d0 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f  K;.  }.  rc = mo
1f0e0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1f0f0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1f100 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  .}.../*.** Step 
1f110 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1f120 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
1f130 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
1f140 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1f150 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1f160 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1f170 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1f180 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1f190 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1f1a0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1f1b0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
1f1c0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1f1d0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
1f1e0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
1f1f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f200 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
1f210 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1f220 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1f230 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
1f240 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1f250 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f260 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1f270 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1f280 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1f290 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f2a0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1f2b0 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
1f2c0 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
1f2d0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1f2e0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1f2f0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1f300 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f310 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1f320 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b   pCur->skip<0 ){
1f330 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1f340 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1f350 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1f360 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1f370 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1f380 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1f390 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f3a0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
1f3b0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1f3c0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1f3d0 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
1f3e0 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
1f3f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1f400 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1f410 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
1f420 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1f430 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
1f440 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
1f450 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1f460 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
1f470 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
1f480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
1f490 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
1f4a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
1f4b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
1f4c0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
1f4d0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
1f4e0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1f4f0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
1f500 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
1f510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f520 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1f530 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1f540 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
1f550 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1f560 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1f570 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1f580 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70  NKey = 0;..    p
1f590 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f5a0 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70  >iPage]--;.    p
1f5b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1f5c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f5d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1f5e0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
1f5f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1f600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1f610 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
1f620 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
1f630 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1f640 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1f650 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
1f660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f670 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1f680 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
1f690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f6a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
1f6b0 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
1f6c0 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
1f6d0 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
1f6e0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
1f6f0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
1f700 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
1f710 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
1f720 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
1f730 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
1f740 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
1f750 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
1f760 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1f770 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
1f780 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1f790 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
1f7a0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
1f7b0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1f7c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1f7d0 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
1f7e0 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
1f7f0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
1f800 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
1f810 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20   and *pPgno are 
1f820 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  undefined in the
1f830 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
1f840 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  or..** Do not in
1f850 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65  voke sqlite3Page
1f860 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50  rUnref() on *ppP
1f870 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  age if an error 
1f880 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1f890 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
1f8a0 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
1f8b0 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66  not 0, then a (f
1f8c0 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73  eeble) effort is
1f8d0 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
1f8e0 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
1f8f0 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
1f900 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
1f910 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
1f920 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
1f930 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
1f940 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
1f950 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
1f960 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1f970 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
1f980 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
1f990 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
1f9a0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1f9b0 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65  "exact" paramete
1f9c0 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20  r is not 0, and 
1f9d0 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
1f9e0 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a  nearby exists .*
1f9f0 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
1fa00 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
1fa10 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65  n it is guarente
1fa20 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
1fa30 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  d. This.** is on
1fa40 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  ly used by auto-
1fa50 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1fa60 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
1fa70 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f   a new table..*/
1fa80 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1fa90 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
1faa0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1fab0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1fac0 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50  age, .  Pgno *pP
1fad0 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61  gno, .  Pgno nea
1fae0 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a  rby,.  u8 exact.
1faf0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1fb00 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
1fb10 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20    int n;     /* 
1fb20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1fb30 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1fb40 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20  */.  int k;     
1fb50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
1fb60 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
1fb70 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1fb80 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
1fb90 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
1fba0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
1fbb0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1fbc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1fbd0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1fbe0 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
1fbf0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d  t->pPage1;.  n =
1fc00 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1fc10 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1fc20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
1fc30 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
1fc40 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1fc50 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
1fc60 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
1fc70 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
1fc80 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
1fc90 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
1fca0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
1fcb0 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
1fcc0 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
1fcd0 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68     .    /* If th
1fce0 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65  e 'exact' parame
1fcf0 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64  ter was true and
1fd00 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
1fd10 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
1fd20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
1fd30 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
1fd40 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
1fd50 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
1fd60 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
1fd70 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
1fd80 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
1fd90 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
1fda0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1fdb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1fdc0 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26  .    if( exact &
1fdd0 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65 72 50  & nearby<=pagerP
1fde0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
1fdf0 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
1fe00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1fe10 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
1fe20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
1fe30 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
1fe40 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1fe50 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
1fe60 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
1fe70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1fe80 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
1fe90 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
1fea0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
1feb0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
1fec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1fed0 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
1fee0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1fef0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1ff00 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
1ff10 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
1ff20 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
1ff30 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
1ff40 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
1ff50 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
1ff60 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
1ff70 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
1ff80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ff90 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1ffa0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1ffb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1ffc0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
1ffd0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1ffe0 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
1fff0 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
20000 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
20010 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
20020 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
20030 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
20040 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
20050 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
20060 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
20070 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
20080 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
20090 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
200a0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
200b0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
200c0 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
200d0 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
200e0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
200f0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
20100 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
20110 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
20120 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
20130 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
20140 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
20150 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
20160 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
20170 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
20180 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
20190 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
201a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
201b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
201c0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
201d0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
201e0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
201f0 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  }..      k = get
20200 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
20210 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
20220 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
20230 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
20240 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
20250 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
20260 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
20270 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
20280 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
20290 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
202a0 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
202b0 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
202c0 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
202d0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
202e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
202f0 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
20300 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
20310 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20320 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
20330 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
20340 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
20350 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
20360 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
20370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
20380 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
20390 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
203a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
203b0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
203c0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
203d0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
203e0 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
203f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
20400 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
20410 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
20420 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
20430 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
20440 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20450 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   k>pBt->usableSi
20460 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
20470 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
20480 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  k is out of rang
20490 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  e.  Database cor
204a0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
204b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
204c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
204d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
204e0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
204f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20500 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20510 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
20520 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79  chList && nearby
20530 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  ==iTrunk ){.    
20540 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
20550 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
20560 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
20570 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
20580 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
20590 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
205a0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
205b0 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
205c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
205d0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
205e0 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20  ==iTrunk );.    
205f0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
20600 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
20610 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
20620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20630 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
20640 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
20650 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
20660 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
20670 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
20680 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
20690 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
206a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
206b0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
206c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
206d0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
206e0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
206f0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
20700 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20710 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
20720 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
20730 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
20740 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
20750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20770 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
20780 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
20790 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
207a0 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
207b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
207c0 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
207d0 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
207e0 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
207f0 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
20800 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
20810 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
20820 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
20830 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
20840 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
20850 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
20860 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
20870 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
20880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20890 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
208a0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
208b0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
208c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
208d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
208e0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
208f0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
20900 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
20910 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
20920 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20930 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
20940 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
20950 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20970 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
20980 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
20990 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
209a0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
209b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
209c0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
209d0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
209e0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
209f0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
20a00 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
20a10 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
20a20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
20a30 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
20a40 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
20a50 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
20a60 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
20a70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20a80 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
20a90 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
20aa0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
20ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
20ac0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
20ad0 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
20ae0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
20af0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20b00 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
20b10 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
20b20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20b30 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
20b40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20b50 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
20b60 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
20b70 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
20b80 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
20b90 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
20ba0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
20bb0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
20bc0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
20bd0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
20be0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
20bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20c00 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
20c10 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
20c20 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
20c30 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
20c40 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
20c50 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
20c60 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
20c70 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  e{.        /* Ex
20c80 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
20c90 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
20ca0 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65         int close
20cb0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
20cc0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
20cd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
20ce0 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
20cf0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
20d00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20d10 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
20d20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
20d30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
20d40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
20d50 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
20d60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
20d70 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
20d80 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69         int i, di
20d90 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
20da0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
20db0 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34       dist = get4
20dc0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
20dd0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
20de0 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29      if( dist<0 )
20df0 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20   dist = -dist;. 
20e00 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
20e10 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
20e20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
20e30 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
20e40 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
20e50 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  by;.            
20e60 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20  if( d2<0 ) d2 = 
20e70 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -d2;.           
20e80 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
20ea0 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
20eb0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
20ec0 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
20ed0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
20ee0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20ef0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
20f00 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
20f10 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
20f20 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
20f30 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
20f40 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
20f50 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
20f60 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
20f70 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
20f80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  t;.          Pgn
20f90 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o nPage;.       
20fa0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
20fb0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61  e;.          nPa
20fc0 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
20fd0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  unt(pBt);.      
20fe0 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e      if( *pPgno>n
20ff0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
21000 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65      /* Free page
21010 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
21020 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
21030 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21040 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21050 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
21060 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
21070 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
21080 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  }.          TRAC
21090 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
210a0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
210b0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210d0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
210e0 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
210f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
21100 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
21110 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
21120 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
21130 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
21140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21150 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
21160 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
21170 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
21180 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21190 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
211a0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
211b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
211c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
211d0 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d  riteable(pTrunk-
211e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
211f0 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
21200 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
21210 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
21220 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
21230 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
21240 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
21250 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
21260 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
21270 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21290 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
212a0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
212b0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
212c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
212d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
212e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
212f0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
21300 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
21310 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
21320 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
21330 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
21340 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
21350 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
21360 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
21370 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
21380 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
21390 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
213a0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
213b0 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
213c0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
213d0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
213e0 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a  ge at the.    **
213f0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
21400 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
21410 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
21420 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50  nt(pBt);.    *pP
21430 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b  gno = nPage + 1;
21440 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f  ..    if( *pPgno
21450 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
21460 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
21470 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
21480 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
21490 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
214a0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
214b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
214c0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
214d0 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20  , *pPgno) ){.   
214e0 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
214f0 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
21500 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
21510 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
21520 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
21530 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
21540 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
21550 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
21560 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
21570 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
21580 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
21590 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
215a0 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
215b0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
215c0 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  /.      TRACE(("
215d0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
215e0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
215f0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
21600 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
21610 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
21620 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
21630 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
21640 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
21650 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
21660 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
21670 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70  PAGE(pBt) ){ (*p
21680 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d  Pgno)++; }.    }
21690 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
216a0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
216b0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
216c0 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
216d0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
216e0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
216f0 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
21700 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
21710 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
21720 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
21730 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
21740 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
21750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21760 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21770 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
21780 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
21790 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
217a0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
217b0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
217c0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
217d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
217e0 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
217f0 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
21800 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
21810 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
21820 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
21830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21840 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
21850 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
21860 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
21870 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
21880 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
21890 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
218a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
218b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
218c0 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
218d0 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
218e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
218f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
21900 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
21910 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
21920 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
21930 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
21940 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
21950 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
21960 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
21970 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
21980 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
21990 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
219a0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
219b0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
219c0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
219d0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
219e0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
219f0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
21a00 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
21a10 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
21a20 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
21a30 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
21a40 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
21a50 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
21a60 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
21a70 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
21a80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
21a90 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
21aa0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
21ab0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
21ac0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
21ad0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
21ae0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
21af0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
21b00 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
21b10 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
21b20 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
21b30 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
21b40 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
21b50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b70 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
21b80 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
21b90 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bb0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
21bc0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
21bd0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
21be0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
21bf0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
21c00 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
21c10 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
21c20 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
21c30 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
21c40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
21c50 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
21c60 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
21c70 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
21ca0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
21cb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
21cd0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
21ce0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
21cf0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
21d00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
21d10 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
21d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
21d30 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
21d40 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
21d50 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
21d60 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
21d70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
21d80 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
21d90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
21da0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
21db0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
21dc0 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
21dd0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
21de0 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
21df0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
21e00 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
21e10 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
21e20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21e30 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
21e40 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
21e50 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
21e60 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
21e70 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
21e80 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
21e90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
21ea0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
21eb0 65 65 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53  ee+1);..#ifdef S
21ec0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
21ed0 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ETE.  /* If the 
21ee0 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
21ef0 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  LETE compile-tim
21f00 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
21f10 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  led, then.  ** a
21f20 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
21f30 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
21f40 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
21f50 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eros..  */.  if(
21f60 20 28 21 70 50 61 67 65 20 26 26 20 28 72 63 20   (!pPage && (rc 
21f70 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
21f80 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
21f90 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20  , &pPage, 0))). 
21fa0 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
21fb0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
21fc0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
21fd0 44 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20  DbPage)).  ){.  
21fe0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
21ff0 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  out;.  }.  memse
22000 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
22010 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
22020 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66  ageSize);.#endif
22030 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
22040 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
22050 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
22060 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
22070 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
22080 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
22090 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
220a0 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
220b0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
220c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
220d0 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
220e0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
220f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
22100 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
22110 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
22120 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
22130 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
22140 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
22150 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
22160 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
22170 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
22180 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
22190 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
221a0 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
221b0 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
221c0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
221d0 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
221e0 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
221f0 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
22200 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
22210 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
22220 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
22230 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
22240 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
22250 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
22260 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
22270 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
22280 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
22290 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
222a0 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
222b0 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
222c0 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
222d0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65  0 ){.    int nLe
222e0 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
222f0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
22300 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
22310 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
22320 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
22330 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
22340 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
22350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22360 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
22370 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
22380 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
22390 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
223a0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
223b0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
223c0 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
223d0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
223e0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
223f0 20 6e 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20   nLeaf<0 ){.    
22400 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22410 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
22420 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
22430 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
22440 66 28 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73  f( nLeaf<pBt->us
22450 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
22460 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
22470 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
22480 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
22490 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
224a0 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
224b0 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
224c0 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
224d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
224e0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
224f0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
22500 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
22510 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
22520 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
22530 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
22540 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
22550 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
22560 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
22570 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
22580 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
22590 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
225a0 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
225b0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
225c0 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
225d0 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
225e0 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
225f0 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
22600 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
22610 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
22620 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
22630 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
22640 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
22650 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
22660 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
22670 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
22680 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
22690 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
226a0 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72  contain to restr
226b0 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
226c0 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
226d0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
226e0 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
226f0 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
22700 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
22710 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
22720 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
22730 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
22740 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
22750 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
22760 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
22770 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
22780 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
22790 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
227a0 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
227b0 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  8"..      */.   
227c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
227d0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
227e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
227f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22800 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
22810 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
22820 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
22830 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
22840 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
22850 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
22860 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66   iPage);.#ifndef
22870 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
22880 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 69 66  ELETE.        if
22890 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
228a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
228b0 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
228c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
228d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
228e0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
228f0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
22900 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
22910 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
22920 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
22930 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
22940 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
22950 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
22960 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
22970 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
22980 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
22990 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
229a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
229b0 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
229c0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
229d0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
229e0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
229f0 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
22a00 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
22a10 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
22a20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
22a30 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
22a40 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
22a50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
22a60 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
22a70 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
22a80 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
22a90 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
22aa0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
22ab0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
22ac0 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
22ad0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
22ae0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
22af0 2f 0a 20 20 69 66 28 20 28 21 70 50 61 67 65 20  /.  if( (!pPage 
22b00 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
22b10 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
22b20 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
22b30 20 30 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20   0))).   ||     
22b40 20 20 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c         (rc = sql
22b50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22b60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a  Page->pDbPage)).
22b70 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72    ){.    goto fr
22b80 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
22b90 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
22ba0 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
22bb0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
22bc0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
22bd0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
22be0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
22bf0 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
22c00 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
22c10 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
22c20 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
22c30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
22c40 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
22c50 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
22c60 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
22c70 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
22c80 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
22c90 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
22ca0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
22cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
22cc0 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
22cd0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
22ce0 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 72 65 65  ){.  return free
22cf0 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
22d00 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
22d10 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pgno);.}../*.** 
22d20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
22d30 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
22d40 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
22d50 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n Cell..*/.stati
22d60 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
22d70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
22d80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
22d90 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65  Cell){.  BtShare
22da0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
22db0 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
22dc0 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
22dd0 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
22de0 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
22df0 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  int ovflPageSize
22e00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
22e10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22e20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
22e30 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
22e40 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
22e50 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
22e60 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
22e70 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
22e80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
22e90 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
22ea0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
22eb0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
22ec0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
22ed0 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
22ee0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
22ef0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
22f00 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
22f10 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
22f20 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
22f30 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61   = (info.nPayloa
22f40 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  d - info.nLocal 
22f50 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
22f60 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
22f70 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c  ;.  assert( ovfl
22f80 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c  Pgno==0 || nOvfl
22f90 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  >0 );.  while( n
22fa0 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
22fb0 6e 6f 20 69 4e 65 78 74 3b 0a 20 20 20 20 4d 65  no iNext;.    Me
22fc0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
22fd0 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
22fe0 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e  no==0 || ovflPgn
22ff0 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
23000 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
23010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
23020 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
23030 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
23040 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
23050 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
23060 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
23070 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
23080 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
23090 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
230a0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
230b0 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
230c0 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  Pgno);.    if( p
230d0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
230e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
230f0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
23100 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
23110 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
23120 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
23130 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
23140 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
23150 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
23160 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
23170 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
23180 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
23190 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
231a0 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
231b0 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
231c0 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
231d0 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
231e0 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
231f0 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
23200 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
23210 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
23220 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
23230 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
23240 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
23250 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
23260 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
23270 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
23280 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
23290 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
232a0 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
232b0 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
232c0 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
232d0 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
232e0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
232f0 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
23300 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
23310 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
23320 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
23330 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
23340 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
23350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
23360 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
23370 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
23380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23390 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
233a0 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
233b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
233c0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
233d0 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
233e0 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
233f0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
23400 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
23410 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
23420 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
23430 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
23440 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
23450 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
23480 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
23490 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
234a0 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
234c0 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
234d0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
234e0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
234f0 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
23500 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
23510 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
23520 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
23530 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
23540 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
23550 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
23560 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
23570 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
23580 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
23590 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
235a0 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
235b0 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
235c0 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
235d0 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
235e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
235f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
23600 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
23610 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
23620 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
23630 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
23640 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
23650 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
23660 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
23670 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
23680 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
23690 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
236a0 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
236b0 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
236c0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
236d0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
236e0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
236f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
23700 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
23710 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
23720 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
23730 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
23740 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
23750 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
23760 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
23770 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
23780 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
23790 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
237a0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
237b0 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
237c0 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
237d0 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
237e0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
237f0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
23800 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
23810 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
23820 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
23830 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
23840 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
23850 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
23860 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
23870 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
23880 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
23890 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75  ( info.nData==(u
238a0 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  32)(nData+nZero)
238b0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
238c0 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
238d0 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
238e0 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
238f0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
23900 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
23910 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
23920 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
23930 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
23940 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3e  { .    if( nKey>
23950 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b  0x7fffffff || pK
23960 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ey==0 ){.      r
23970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
23980 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
23990 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
239a0 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
239b0 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
239c0 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
239d0 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
239e0 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
239f0 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
23a00 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
23a10 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
23a20 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
23a30 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
23a40 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
23a50 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
23a60 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
23a70 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
23a80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
23a90 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
23aa0 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
23ab0 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
23ac0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
23ad0 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
23ae0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
23af0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
23b00 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
23b10 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
23b20 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
23b30 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
23b40 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
23b50 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
23b60 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
23b70 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
23b80 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
23b90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
23ba0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
23bb0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
23bc0 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
23bd0 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
23be0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23bf0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
23c00 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
23c10 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
23c20 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
23c30 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
23c40 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
23c50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
23c60 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
23c70 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
23c80 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
23c90 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
23ca0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
23cb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
23cc0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
23cd0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
23ce0 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
23cf0 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
23d00 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
23d10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
23d20 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
23d30 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
23d40 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
23d50 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
23d60 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
23d70 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
23d80 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
23d90 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
23da0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
23db0 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
23dc0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
23dd0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
23de0 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
23df0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
23e00 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
23e10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
23e20 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
23e30 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
23e40 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
23e50 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
23e60 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
23e70 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OW1);.        rc
23e80 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
23e90 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
23ea0 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  e, pgnoPtrmap);.
23eb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
23ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
23ed0 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
23ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ef0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
23f00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
23f10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
23f20 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
23f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23f40 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
23f50 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
23f60 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
23f70 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
23f80 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
23f90 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
23fa0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
23fb0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
23fc0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
23fd0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
23fe0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
23ff0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
24000 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
24010 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
24020 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
24030 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
24040 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
24050 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
24060 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
24070 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
24080 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
24090 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
240a0 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
240b0 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
240c0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
240d0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
240e0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
240f0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
24100 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
24110 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
24120 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
24130 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
24140 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
24150 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
24160 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
24170 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
24180 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
24190 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
241a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
241b0 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
241c0 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
241d0 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
241e0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
241f0 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
24200 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
24210 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
24220 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
24230 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
24240 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
24250 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
24260 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
24270 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
24280 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
24290 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
242a0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
242b0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
242c0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
242d0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
242e0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
242f0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
24300 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
24310 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
24320 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
24330 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
24340 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
24350 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
24360 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
24370 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
24380 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
24390 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
243a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
243b0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
243c0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
243d0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
243e0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
243f0 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
24400 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
24410 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
24420 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
24430 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
24440 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
24450 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
24460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
24470 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
24480 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
24490 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
244a0 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
244b0 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
244c0 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
244d0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
244e0 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
244f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
24500 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
24510 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
24520 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
24530 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
24540 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
24550 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
24560 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
24570 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
24580 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
24590 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
245a0 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
245b0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
245c0 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
245d0 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
245e0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
245f0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
24600 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
24610 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
24620 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
24630 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
24640 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
24650 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
24660 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
24670 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
24680 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
24690 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
246a0 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  nt dropCell(MemP
246b0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
246c0 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20  idx, int sz){.  
246d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
246e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
246f0 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
24700 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
24710 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
24720 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
24730 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
24740 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
24750 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
24760 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
24770 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
24780 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
24790 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
247a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
247b0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
247c0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
247d0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
247e0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
247f0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
24800 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
24810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
24820 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
24830 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
24840 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
24850 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24860 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
24870 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
24880 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
24890 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61  a;.  ptr = &data
248a0 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
248b0 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70  et + 2*idx];.  p
248c0 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
248d0 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50 61  );.  if( (pc<pPa
248e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
248f0 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
24900 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b 73  )).     || (pc+s
24910 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  z>pPage->pBt->us
24920 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  ableSize) ){.   
24930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24940 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24950 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
24960 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
24970 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
24990 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f  urn rc;.  }.  fo
249a0 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
249b0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
249c0 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
249d0 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
249e0 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
249f0 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
24a00 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
24a10 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
24a20 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
24a30 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
24a40 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
24a50 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  2;.  return SQLI
24a60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24a70 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
24a80 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
24a90 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
24aa0 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
24ab0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
24ac0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
24ad0 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
24ae0 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
24af0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
24b00 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
24b10 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
24b20 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
24b30 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
24b40 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
24b50 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
24b60 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
24b70 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
24b80 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
24b90 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
24ba0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
24bb0 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
24bc0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
24bd0 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
24be0 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
24bf0 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
24c00 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
24c10 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
24c20 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
24c30 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
24c40 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
24c50 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
24c60 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
24c70 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
24c80 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
24c90 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
24ca0 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
24cb0 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
24cc0 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
24cd0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
24ce0 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
24cf0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
24d00 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
24d10 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
24d20 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
24d30 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
24d40 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
24d50 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
24d60 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
24d70 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
24d80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
24d90 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
24da0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
24db0 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
24dc0 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
24dd0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
24de0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
24df0 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
24e00 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
24e10 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
24e20 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
24e30 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
24e40 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
24e50 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
24e60 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
24e70 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
24e80 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
24e90 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
24ea0 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
24eb0 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
24ec0 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20    u8 nSkip      
24ed0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72      /* Do not wr
24ee0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53  ite the first nS
24ef0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
24f00 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   cell */.){.  in
24f10 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
24f20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
24f30 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
24f40 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
24f50 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
24f60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
24f70 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ter */.  int top
24f80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
24f90 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74  rst byte of cont
24fa0 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c  ent for any cell
24fb0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
24fc0 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
24fd0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
24fe0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
24ff0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
25000 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
25010 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
25020 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
25030 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
25040 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
25050 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  d */.  int hdr; 
25060 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
25070 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f  et into data[] o
25080 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  f the page heade
25090 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  r */.  int cellO
250a0 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
250b0 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
250c0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
250d0 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
250e0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
250f0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
25100 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
25110 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
25120 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
25130 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
25140 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
25150 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
25160 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
25170 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
25180 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
25190 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
251a0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
251b0 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
251c0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
251d0 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72  =5460 );.  asser
251e0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
251f0 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
25200 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a  Page->aOvfl) );.
25210 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
25220 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
25230 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
25240 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25250 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
25260 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
25270 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
25280 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
25290 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
252a0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
252b0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
252c0 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
252d0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
252e0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
252f0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  emp;.    }.    j
25300 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
25310 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
25320 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
25330 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f  f(pPage->aOvfl)/
25340 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
25350 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
25360 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
25370 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
25380 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
25390 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b  j].idx = (u16)i;
253a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
253b0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
253c0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
253d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
253e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
253f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
25410 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
25420 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
25430 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
25440 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
25450 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
25460 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
25470 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
25480 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
25490 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
254a0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
254b0 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
254c0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
254d0 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
254e0 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
254f0 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20  ->nCell + 2;.   
25500 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
25510 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28  t + 2*i;.    if(
25520 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20   end > top - sz 
25530 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65  ){.      rc = de
25540 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
25550 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
25560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25570 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
25580 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
25590 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
255a0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
255b0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64       assert( end
255c0 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a   + sz <= top );.
255d0 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20      }.    idx = 
255e0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
255f0 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73  age, sz);.    as
25600 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20  sert( idx>0 );. 
25610 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c     assert( end <
25620 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
25630 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20  [hdr+5]) );.    
25640 69 66 20 28 69 64 78 2b 73 7a 20 3e 20 70 50 61  if (idx+sz > pPa
25650 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
25660 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 72 65 74  ize) {.      ret
25670 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25680 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
25690 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
256a0 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
256b0 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65  ree -= 2;.    me
256c0 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
256d0 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
256e0 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
256f0 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20     for(j=end-2, 
25700 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
25710 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
25720 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
25730 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
25740 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
25750 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
25760 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
25770 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
25780 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
25790 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
257a0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
257b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
257c0 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
257d0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
257e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
257f0 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
25800 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
25810 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
25820 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
25830 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
25840 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
25850 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
25860 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
25870 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c     */.      Cell
25880 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
25890 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
258a0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
258b0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
258c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
258d0 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
258e0 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
258f0 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
25900 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69  yload );.      i
25910 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  f( (info.nData+(
25920 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
25930 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f  info.nKey))>info
25940 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
25950 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
25960 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
25970 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
25980 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  w]);.        rc 
25990 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  = ptrmapPut(pPag
259a0 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  e->pBt, pgnoOvfl
259b0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
259c0 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
259d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
259e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
259f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
25a00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
25a10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
25a20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25a30 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
25a40 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
25a50 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
25a60 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
25a70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
25a80 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
25a90 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
25aa0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
25ab0 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
25ac0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25ad0 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
25ae0 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
25af0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
25b00 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
25b10 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
25b20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
25b30 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
25b40 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
25b50 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
25b60 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
25b70 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
25b80 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
25b90 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
25ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25bb0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
25bc0 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b    int totalSize;
25bd0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
25be0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
25bf0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
25c00 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
25c10 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
25c20 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20  .  int cellptr; 
25c30 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
25c40 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
25c50 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
25c60 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
25c70 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
25c80 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
25c90 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
25ca0 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  /* Data for the 
25cb0 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
25cc0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
25cd0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
25ce0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25cf0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
25d00 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
25d10 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20  ssert( nCell>=0 
25d20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  && nCell<=MX_CEL
25d30 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
25d40 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
25d50 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
25d60 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
25d70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
25d80 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
25d90 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
25da0 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
25db0 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
25dc0 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
25dd0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
25de0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
25df0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
25e00 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
25e10 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
25e20 67 65 29 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72  ge) );.  cellptr
25e30 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
25e40 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
25e50 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
25e60 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
25e70 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74  ffset;.  put2byt
25e80 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
25e90 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43  nCell);.  if( nC
25ea0 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62  ell ){.    cellb
25eb0 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  ody = allocateSp
25ec0 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c  ace(pPage, total
25ed0 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
25ee0 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b  t( cellbody>0 );
25ef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
25f00 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e  ge->nFree >= 2*n
25f10 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  Cell );.    pPag
25f20 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43  e->nFree -= 2*nC
25f30 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ell;.    for(i=0
25f40 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
25f50 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
25f60 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20  &data[cellptr], 
25f70 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20  cellbody);.     
25f80 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
25f90 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
25fa0 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20  i], aSize[i]);. 
25fb0 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20       cellptr += 
25fc0 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64  2;.      cellbod
25fd0 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y += aSize[i];. 
25fe0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
25ff0 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65   cellbody==pPage
26000 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
26010 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  e );.  }.  pPage
26020 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
26030 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
26040 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
26050 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
26060 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
26070 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
26080 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
26090 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
260a0 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
260b0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
260c0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
260d0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
260e0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
260f0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
26100 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
26110 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
26120 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
26130 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
26140 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
26150 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
26160 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
26170 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
26180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
26190 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
261a0 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
261b0 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
261c0 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
261d0 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
261e0 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
261f0 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
26200 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
26210 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
26220 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
26230 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
26240 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
26250 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
26260 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
26270 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
26280 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
26290 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
262a0 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
262b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
262c0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
262d0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
262e0 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
262f0 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
26300 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
26310 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
26320 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20   balance */../* 
26330 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
26340 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
26350 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72  balance(BtCursor
26360 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65  *, int);..#ifnde
26370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
26380 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
26390 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
263a0 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
263b0 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
263c0 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
263d0 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
263e0 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
263f0 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
26400 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
26410 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
26420 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
26430 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
26440 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
26450 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
26460 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
26470 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
26480 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
26490 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
264a0 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
264b0 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
264c0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
264d0 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
264e0 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
264f0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
26500 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
26510 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
26520 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
26530 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
26540 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
26550 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
26560 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
26570 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
26580 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
26590 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
265a0 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
265b0 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
265c0 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
265d0 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
265e0 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
265f0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
26600 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
26610 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
26620 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
26630 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
26640 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
26650 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
26660 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
26670 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
26680 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
26690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
266a0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 42 74 43 75  lance_quick(BtCu
266b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
266c0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
266d0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 50 67   *pNew = 0;.  Pg
266e0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38  no pgnoNew;.  u8
266f0 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73   *pCell;.  u16 s
26700 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66  zCell;.  CellInf
26710 6f 20 69 6e 66 6f 3b 0a 20 20 4d 65 6d 50 61 67  o info;.  MemPag
26720 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
26730 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26740 61 67 65 5d 3b 0a 20 20 4d 65 6d 50 61 67 65 20  age];.  MemPage 
26750 2a 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d  *pParent = pCur-
26760 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26770 61 67 65 2d 31 5d 3b 0a 20 20 42 74 53 68 61 72  age-1];.  BtShar
26780 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
26790 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65  >pBt;.  int pare
267a0 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d  ntIdx = pParent-
267b0 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61  >nCell;   /* pPa
267c0 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72  rent new divider
267d0 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
267e0 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b   int parentSize;
267f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26800 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
26810 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
26820 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c  /.  u8 parentCel
26830 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20  l[64];          
26840 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
26850 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  or the new divid
26860 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73  er cell */..  as
26870 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
26880 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
26890 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
268a0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
268b0 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74  new page. Insert
268c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
268d0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20  ll from pPage.  
268e0 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e  ** into it. Then
268f0 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72   remove the over
26900 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
26910 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  Page..  */.  rc 
26920 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
26930 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
26940 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
26950 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 65 6c  E_OK ){.    pCel
26970 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
26980 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 73  [0].pCell;.    s
26990 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
269a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
269b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
269c0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
269d0 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
269e0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72  Page) );.    zer
269f0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67  oPage(pNew, pPag
26a00 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  e->aData[0]);.  
26a10 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
26a20 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
26a30 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  &szCell);.    pP
26a40 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
26a50 20 30 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 70 50   0;.  .    /* pP
26a60 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
26a70 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
26a80 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
26a90 6e 67 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  nge this.    ** 
26aa0 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
26ab0 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
26ac0 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
26ad0 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 20 20  d above and.    
26ae0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
26af0 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
26b00 69 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ild. .    **.   
26b10 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72   ** Ignore the r
26b20 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
26b30 68 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49  he call to fillI
26b40 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43  nCell(). fillInC
26b50 65 6c 6c 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ell().    ** may
26b60 20 6f 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68   only return oth
26b70 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
26b80 4b 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69  K if it is requi
26b90 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  red to allocate.
26ba0 20 20 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f      ** one or mo
26bb0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
26bc0 73 2e 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65  s. Since an inte
26bd0 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65  rnal table B-Tre
26be0 65 20 63 65 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d  e cell .    ** m
26bf0 61 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f  ay never spill o
26c00 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72  ver onto an over
26c10 66 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69 73  flow page (it is
26c20 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20   a maximum of . 
26c30 20 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69     ** 13 bytes i
26c40 6e 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e  n size), it is n
26c50 6f 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f  ot neccessary to
26c60 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
26c70 6e 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  n code..    **. 
26c80 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
26c90 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
26ca0 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  ) function canno
26cb0 74 20 66 61 69 6c 20 69 66 20 74 68 65 20 70 61  t fail if the pa
26cc0 67 65 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  ge.    ** being 
26cd0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73  inserted into is
26ce0 20 61 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c   already writabl
26cf0 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64  e and the cell d
26d00 6f 65 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  oes not .    ** 
26d10 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66  contain an overf
26d20 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20  low pointer. So 
26d30 69 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75  ignore this retu
26d40 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 20  rn code too..   
26d50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26d60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
26d70 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ;.    pCell = fi
26d80 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
26d90 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
26da0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
26db0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
26dc0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
26dd0 3b 0a 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c  ;.    fillInCell
26de0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
26df0 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
26e00 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
26e10 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 61  rentSize);.    a
26e20 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a  ssert( parentSiz
26e30 65 3c 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65  e<64 );.    asse
26e40 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
26e50 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
26e60 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
26e70 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
26e80 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49  pParent, parentI
26e90 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  dx, parentCell, 
26ea0 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34  parentSize, 0, 4
26eb0 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
26ec0 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
26ed0 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49  (pParent,parentI
26ee0 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  dx), pPage->pgno
26ef0 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
26f00 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
26f10 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
26f20 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
26f30 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
26f40 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
26f50 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
26f60 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
26f70 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74  r map.    ** wit
26f80 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
26f90 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
26fa0 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
26fb0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c   the .    ** cel
26fc0 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
26fd0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
26fe0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
26ff0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
27000 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
27010 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
27020 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
27030 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
27040 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
27050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27060 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
27070 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30  pPutOvfl(pNew, 0
27080 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27090 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
270a0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
270b0 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
270c0 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  */.    releasePa
270d0 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ge(pNew);.  }.. 
270e0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
270f0 74 20 74 68 65 20 70 50 61 67 65 2d 3e 6e 46 72  t the pPage->nFr
27100 65 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  ee variable is n
27110 6f 74 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  ot set correctly
27120 20 77 69 74 68 0a 20 20 2a 2a 20 72 65 73 70 65   with.  ** respe
27130 63 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ct to the conten
27140 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 28 62  t of the page (b
27150 65 63 61 75 73 65 20 69 74 20 77 61 73 20 73 65  ecause it was se
27160 74 20 74 6f 20 30 20 62 79 20 0a 20 20 2a 2a 20  t to 0 by .  ** 
27170 69 6e 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f 20  insertCell). So 
27180 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65  call sqlite3Btre
27190 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f 20 6d  eInitPage() to m
271a0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 0a 20  ake sure it is. 
271b0 20 2a 2a 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   ** correct..  *
271c0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 68 61 73 20  *.  ** This has 
271d0 74 6f 20 62 65 20 64 6f 6e 65 20 65 76 65 6e 20  to be done even 
271e0 69 66 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c  if an error will
271f0 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 4e 6f   be returned. No
27200 72 6d 61 6c 6c 79 2c 20 69 66 0a 20 20 2a 2a 20  rmally, if.  ** 
27210 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
27220 64 75 72 69 6e 67 20 74 72 65 65 20 62 61 6c 61  during tree bala
27230 6e 63 69 6e 67 2c 20 74 68 65 20 63 6f 6e 74 65  ncing, the conte
27240 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61  nts of MemPage a
27250 72 65 0a 20 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f  re.  ** not impo
27260 72 74 61 6e 74 2c 20 61 73 20 74 68 65 79 20 77  rtant, as they w
27270 69 6c 6c 20 62 65 20 72 65 63 61 6c 63 75 6c 61  ill be recalcula
27280 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 61 67  ted when the pag
27290 65 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  e is rolled.  **
272a0 20 62 61 63 6b 2e 20 42 75 74 20 68 65 72 65 2c   back. But here,
272b0 20 69 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63   in balance_quic
272c0 6b 28 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69  k(), it is possi
272d0 62 6c 65 20 74 68 61 74 20 70 50 61 67 65 20 68  ble that pPage h
272e0 61 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 79 65 74  as .  ** not yet
272f0 20 62 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72   been marked dir
27300 74 79 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e  ty or written in
27310 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
27320 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20  ile. Therefore. 
27330 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   ** it will not 
27340 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
27350 6e 64 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f  nd so it is impo
27360 72 74 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75  rtant to make su
27370 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
27380 20 70 61 67 65 20 64 61 74 61 20 61 6e 64 20 63   page data and c
27390 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61  ontents of MemPa
273a0 67 65 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e  ge are consisten
273b0 74 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 2d  t..  */.  pPage-
273c0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73  >isInit = 0;.  s
273d0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
273e0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 61 73  age(pPage);.  as
273f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
27400 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
27410 2f 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  /* If everything
27420 20 65 6c 73 65 20 73 75 63 63 65 65 64 65 64 2c   else succeeded,
27430 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
27440 65 6e 74 20 70 61 67 65 2c 20 69 6e 20 0a 20 20  ent page, in .  
27450 2a 2a 20 63 61 73 65 20 74 68 65 20 64 69 76 69  ** case the divi
27460 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65  der cell inserte
27470 64 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62  d caused it to b
27480 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a  ecome overfull..
27490 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
274a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
274b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
274c0 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50  e);.    pCur->iP
274d0 61 67 65 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20  age--;.    rc = 
274e0 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
274f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27500 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
27510 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
27520 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  BALANCE */../*.*
27530 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
27540 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c  edistributes Cel
27550 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20  ls on pPage and 
27560 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69  up to NN*2 sibli
27570 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20  ngs.** of pPage 
27580 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
27590 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
275a0 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20   same amount of 
275b0 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55  free space..** U
275c0 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e  sually NN siblin
275d0 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  gs on either sid
275e0 65 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73  e of pPage is us
275f0 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
27600 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d  ing,.** though m
27610 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  ore siblings mig
27620 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
27630 20 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69   side if pPage i
27640 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f  s the first.** o
27650 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20  r last child of 
27660 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20  its parent.  If 
27670 70 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20  pPage has fewer 
27680 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e  than 2*NN siblin
27690 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67  gs.** (something
276a0 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   which can only 
276b0 68 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20  happen if pPage 
276c0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
276d0 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20   or a .** child 
276e0 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c  of root) then al
276f0 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c  l available sibl
27700 69 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65  ings participate
27710 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
27720 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  g..**.** The num
27730 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ber of siblings 
27740 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62  of pPage might b
27750 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
27760 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20  ecreased by one 
27770 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20  or.** two in an 
27780 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
27790 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
277a0 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
277b0 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67  ll. The root pag
277c0 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20  e.** is special 
277d0 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  and is allowed t
277e0 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  o be nearly empt
277f0 79 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a  y. If pPage is .
27800 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
27810 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68  , then the depth
27820 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67   of the tree mig
27830 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a  ht be increased.
27840 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ** or decreased 
27850 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73  by one, as neces
27860 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68  sary, to keep th
27870 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d  e root page from
27880 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75   being.** overfu
27890 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79  ll or completely
278a0 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   empty..**.** No
278b0 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
278c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
278d0 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
278e0 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a   Cells on pPage.
278f0 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
27900 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
27910 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
27920 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  ].  This can hap
27930 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
27940 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
27950 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62   Part of the job
27960 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
27970 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73   is to.** make s
27980 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f  ure all Cells fo
27990 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61  r pPage once aga
279a0 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d  in fit in pPage-
279b0 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  >aData[]..**.** 
279c0 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66  In the course of
279d0 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73   balancing the s
279e0 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
279f0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  , the parent of 
27a00 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62  pPage.** might b
27a10 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
27a20 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66  r underfull.  If
27a30 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74   that happens, t
27a40 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27a50 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65  .** is called re
27a60 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65  cursively on the
27a70 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   parent..**.** I
27a80 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
27a90 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
27aa0 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65  son, it might le
27ab0 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ave the database
27ac0 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74  .** in a corrupt
27ad0 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66  ed state.  So if
27ae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
27af0 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
27b00 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
27b10 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73  olled back..*/.s
27b20 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
27b30 65 5f 6e 6f 6e 72 6f 6f 74 28 42 74 43 75 72 73  e_nonroot(BtCurs
27b40 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
27b50 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
27b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27b70 20 6f 76 65 72 20 6f 72 20 75 6e 64 65 72 66 75   over or underfu
27b80 6c 6c 20 70 61 67 65 20 74 6f 20 62 61 6c 61 6e  ll page to balan
27b90 63 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ce */.  MemPage 
27ba0 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
27bb0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
27bc0 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  nt of pPage */. 
27bd0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27bf0 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
27c00 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
27c10 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
27c20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27c30 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
27c40 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
27c50 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
27c60 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
27c70 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
27c80 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
27c90 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  m. */.  int nOld
27ca0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27cb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27cc0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
27cd0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  [] */.  int nNew
27ce0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27cf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27d00 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
27d10 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76  [] */.  int nDiv
27d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27d30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27d40 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76  f cells in apDiv
27d50 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
27d60 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
27d70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
27d80 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
27d90 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
27da0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
27db0 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61   of pPage in pPa
27dc0 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
27dd0 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27df0 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
27e00 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
27e10 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
27e20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
27e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27e40 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
27e50 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65  .  int leafCorre
27e60 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
27e70 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
27e80 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
27e90 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
27ea0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
27eb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
27ec0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
27ed0 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
27ee0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
27ef0 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
27f00 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
27f10 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
27f20 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
27f30 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
27f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
27f50 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
27f60 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
27f70 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
27f80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
27f90 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
27fa0 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
27fb0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
27fc0 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
27fd0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
27fe0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
27ff0 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
28000 69 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20  iSpace2 = 0;    
28010 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
28020 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
28030 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20   aSpace2[] */.  
28040 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20  int szScratch;  
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28060 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20  Size of scratch 
28070 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64  memory requested
28080 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
28090 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pOld[NB];       
280a0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
280b0 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
280c0 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  gs */.  Pgno pgn
280d0 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  oOld[NB];       
280e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
280f0 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
28100 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  ge in apOld[] */
28110 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
28120 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
28130 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
28140 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
28150 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
28160 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
28170 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
28180 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
28190 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
281a0 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ing */.  Pgno pg
281b0 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  noNew[NB+2];    
281c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
281d0 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
281e0 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  age in apNew[] *
281f0 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
28200 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
28210 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
28220 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
28230 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
28240 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
28250 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
28260 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
28270 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
28280 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282a0 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
282b0 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
282c0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
282d0 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
282e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
282f0 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
28300 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
28310 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
28320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
28330 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
28340 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
28350 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b   */.  u8 *aCopy[
28360 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
28370 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e  Space for holdin
28380 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79  g data of apCopy
28390 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
283a0 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ce1;           /
283b0 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69  * Space for copi
283c0 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
283d0 65 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61  ells before bala
283e0 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  nce */.  u8 *aSp
283f0 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ace2 = 0;       
28400 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65  /* Space for ove
28410 72 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63  rflow dividers c
28420 65 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ells after balan
28430 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f  ce */.  u8 *aFro
28440 6d 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  m = 0;..  pPage 
28450 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
28460 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
28470 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28480 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
28490 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
284a0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
284b0 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
284c0 3d 20 31 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  = 1 );..  /* .  
284d0 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65  ** Find the pare
284e0 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  nt page..  */.  
284f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
28500 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
28510 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
28520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
28530 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
28540 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
28550 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e  Page) || pPage->
28560 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
28570 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
28580 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20  Bt;.  pParent = 
28590 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
285a0 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61  r->iPage-1];.  a
285b0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29  ssert( pParent )
285c0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
285d0 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
285e0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
285f0 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  nt->pDbPage)) ){
28600 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
28610 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  e_cleanup;.  }..
28620 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
28630 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
28640 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
28650 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
28660 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  arent->pgno));..
28670 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28680 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
28690 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65  .  /*.  ** A spe
286a0 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61  cial case:  If a
286b0 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a   new entry has j
286c0 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ust been inserte
286d0 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61  d into a.  ** ta
286e0 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20  ble (that is, a 
286f0 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67  btree with integ
28700 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20  er keys and all 
28710 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76  data at the leav
28720 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  es).  ** and the
28730 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68   new entry is th
28740 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
28750 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28  ry in the tree (
28760 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20  it has the.  ** 
28770 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65  largest key) the
28780 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61  n use the specia
28790 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
287a0 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20  ) routine for.  
287b0 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62  ** balancing.  b
287c0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
287d0 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e  s much faster an
287e0 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  d results in a t
287f0 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b  ighter.  ** pack
28800 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74  ing of data in t
28810 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
28820 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
28830 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20  ->leaf &&.      
28840 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
28850 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
28860 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20  verflow==1 &&.  
28870 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
28880 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
28890 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70  nCell &&.      p
288a0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
288b0 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74  &&.      get4byt
288c0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
288d0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
288e0 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d  fset+8])==pPage-
288f0 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61  >pgno.  ){.    a
28900 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
28910 74 4b 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20  tKey );.    /*. 
28920 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63     ** TODO: Chec
28930 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  k the siblings t
28940 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50  o the left of pP
28950 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74  age. It may be t
28960 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20  hat.    ** they 
28970 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64  are not full and
28980 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20   no new page is 
28990 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
289a0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61  .    return bala
289b0 6e 63 65 5f 71 75 69 63 6b 28 70 43 75 72 29 3b  nce_quick(pCur);
289c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
289d0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
289e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
289f0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
28a00 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f  Page)) ){.    go
28a10 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
28a20 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  up;.  }..  /*.  
28a30 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c  ** Find the cell
28a40 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
28a50 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63  age whose left c
28a60 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b  hild points back
28a70 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20  .  ** to pPage. 
28a80 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61   The "idx" varia
28a90 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78  ble is the index
28aa0 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20   of that cell.  
28ab0 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73  If pPage.  ** is
28ac0 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63   the rightmost c
28ad0 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20  hild of pParent 
28ae0 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20  then set idx to 
28af0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a  pParent->nCell .
28b00 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75    */.  idx = pCu
28b10 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28b20 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72  Page-1];.  asser
28b30 74 50 61 72 65 6e 74 49 6e 64 65 78 28 70 50 61  tParentIndex(pPa
28b40 72 65 6e 74 2c 20 69 64 78 2c 20 70 50 61 67 65  rent, idx, pPage
28b50 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20  ->pgno);..  /*. 
28b60 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67   ** Find sibling
28b70 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20   pages to pPage 
28b80 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  and the cells in
28b90 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69   pParent that di
28ba0 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69  vide.  ** the si
28bb0 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65  blings.  An atte
28bc0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
28bd0 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
28be0 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73  on either.  ** s
28bf0 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d  ide of pPage.  M
28c00 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
28c10 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
28c20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69  side, however, i
28c30 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65  f.  ** pPage the
28c40 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
28c50 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
28c60 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
28c70 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a    If pParent.  *
28c80 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
28c90 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
28ca0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
28cb0 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
28cc0 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20  n..  */.  nxDiv 
28cd0 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66  = idx - NN;.  if
28ce0 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70  ( nxDiv + NB > p
28cf0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
28d00 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61  .    nxDiv = pPa
28d10 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42  rent->nCell - NB
28d20 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   + 1;.  }.  if( 
28d30 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e  nxDiv<0 ){.    n
28d40 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDiv = 0;.  }.  
28d50 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nDiv = 0;.  for(
28d60 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c  i=0, k=nxDiv; i<
28d70 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20  NB; i++, k++){. 
28d80 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74     if( k<pParent
28d90 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
28da0 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
28db0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29  Cell(pParent, k)
28dc0 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a  ;.      nDiv++;.
28dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
28de0 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a  Parent->leaf );.
28df0 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
28e00 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
28e10 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
28e20 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d   if( k==pParent-
28e30 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
28e40 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
28e50 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
28e60 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
28e70 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
28e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
28e90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
28ea0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
28eb0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64  age(pBt, pgnoOld
28ec0 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  [i], &apOld[i]);
28ed0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
28ee0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
28ef0 75 70 3b 0a 20 20 20 20 2f 2a 20 61 70 4f 6c 64  up;.    /* apOld
28f00 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
28f10 20 6b 3b 20 2a 2f 0a 20 20 20 20 61 70 43 6f 70   k; */.    apCop
28f20 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73  y[i] = 0;.    as
28f30 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b  sert( i==nOld );
28f40 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20  .    nOld++;.   
28f50 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
28f60 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
28f70 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
28f80 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  low;.  }..  /* M
28f90 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20  ake nMaxCells a 
28fa0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e  multiple of 4 in
28fb0 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72   order to preser
28fc0 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61  ve 8-byte.  ** a
28fd0 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d  lignment */.  nM
28fe0 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43  axCells = (nMaxC
28ff0 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20  ells + 3)&~3;.. 
29000 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
29010 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
29020 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20  ry structures.  
29030 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  */.  szScratch =
29040 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
29050 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29070 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
29080 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
29090 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
290c0 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28  .     + (ROUND8(
290d0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
290e0 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a  +pBt->pageSize)*
290f0 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a  NB  /* aCopy */.
29100 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
29110 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
29120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29130 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f     /* aSpace1 */
29140 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56  .     + (ISAUTOV
29150 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c  ACUUM ? nMaxCell
29160 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20  s : 0);         
29170 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a      /* aFrom */.
29180 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
29190 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
291a0 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
291b0 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
291c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
291d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
291e0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
291f0 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
29200 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
29210 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43  nMaxCells];.  aC
29220 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73  opy[0] = (u8*)&s
29230 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
29240 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43  ;.  assert( ((aC
29250 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 30 29  opy[0] - (u8*)0)
29260 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
29270 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
29280 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f  required */.  fo
29290 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b  r(i=1; i<NB; i++
292a0 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20  ){.    aCopy[i] 
292b0 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42  = &aCopy[i-1][pB
292c0 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
292d0 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
292e0 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e))];.    assert
292f0 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28  ( ((aCopy[i] - (
29300 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20 29  u8*)0) & 7)==0 )
29310 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
29320 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
29330 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 31 20  /.  }.  aSpace1 
29340 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70  = &aCopy[NB-1][p
29350 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
29360 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
29370 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge))];.  assert(
29380 20 28 28 61 53 70 61 63 65 31 20 2d 20 28 75 38   ((aSpace1 - (u8
29390 2a 29 30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  *)0) & 7)==0 ); 
293a0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
293b0 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
293c0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
293d0 55 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20  UM ){.    aFrom 
293e0 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  = &aSpace1[pBt->
293f0 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20  pageSize];.  }. 
29400 20 61 53 70 61 63 65 32 20 3d 20 73 71 6c 69 74   aSpace2 = sqlit
29410 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74  e3PageMalloc(pBt
29420 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
29430 66 28 20 61 53 70 61 63 65 32 3d 3d 30 20 29 7b  f( aSpace2==0 ){
29440 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
29450 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
29460 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
29470 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
29480 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
29490 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
294a0 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73   pPage and its s
294b0 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c  iblings into aOl
294c0 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  d[]..  ** The re
294d0 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
294e0 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
294f0 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
29500 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68  s rather.  ** th
29510 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
29520 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
29530 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
29540 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
29550 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
29560 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
29570 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
29580 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
29590 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20     MemPage *p = 
295a0 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
295b0 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a  Page*)aCopy[i];.
295c0 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70      memcpy(p, ap
295d0 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
295e0 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d  emPage));.    p-
295f0 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
29600 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  &p[1];.    memcp
29610 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  y(p->aData, apOl
29620 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
29630 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
29640 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
29650 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
29660 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
29670 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
29680 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
29690 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
296a0 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
296b0 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
296c0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
296d0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
296e0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72  ace obtained for
296f0 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
29700 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
29710 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
29720 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
29730 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
29740 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
29750 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
29760 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
29770 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
29780 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
29790 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
297a0 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
297b0 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
297c0 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
297d0 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
297e0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
297f0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
29800 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
29810 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
29820 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
29830 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
29840 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
29850 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
29860 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
29870 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
29880 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
29890 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
298a0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
298b0 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
298c0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
298d0 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
298e0 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
298f0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
29900 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
29910 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
29920 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
29930 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
29940 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
29950 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
29960 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
29970 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
29980 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  ge->hasData;.  f
29990 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
299a0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
299b0 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
299c0 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
299d0 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
299e0 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
299f0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
29a00 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
29a10 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
29a20 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
29a30 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
29a40 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
29a50 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
29a60 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
29a70 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
29a80 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
29a90 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66  Cell]);.      if
29aa0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
29ab0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b  {.        int a;
29ac0 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e  .        aFrom[n
29ad0 43 65 6c 6c 5d 20 3d 20 28 75 38 29 69 3b 20 20  Cell] = (u8)i;  
29ae0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
29af0 20 69 3c 36 20 29 3b 0a 20 20 20 20 20 20 20 20   i<6 );.        
29b00 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d  for(a=0; a<pOld-
29b10 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29  >nOverflow; a++)
29b20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
29b30 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70  pOld->aOvfl[a].p
29b40 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65  Cell==apCell[nCe
29b50 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ll] ){.         
29b60 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
29b70 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
29b80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
29bb0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
29bc0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
29bd0 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
29be0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
29bf0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
29c00 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
29c10 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
29c20 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
29c30 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
29c40 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
29c50 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
29c60 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
29c70 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
29c80 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
29c90 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
29ca0 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
29cb0 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
29cc0 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
29cd0 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
29ce0 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
29cf0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
29d00 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
29d10 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
29d20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
29d30 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
29d40 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
29d50 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
29d60 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
29d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29d80 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
29d90 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
29da0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
29db0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
29dc0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
29dd0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
29de0 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20  ce1[iSpace1];.  
29df0 20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d        iSpace1 +=
29e00 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73   sz;.        ass
29e10 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
29e20 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
29e30 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
29e40 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce1<=pBt->pageSi
29e50 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
29e60 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
29e70 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
29e80 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
29e90 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
29ea0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
29eb0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
29ec0 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  M ){.          a
29ed0 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
29ee0 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  FF;.        }.  
29ef0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
29f00 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
29f10 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  z);.        asse
29f20 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
29f30 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72  on==0 || leafCor
29f40 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
29f50 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
29f60 6c 6c 5d 20 2d 3d 20 28 75 31 36 29 6c 65 61 66  ll] -= (u16)leaf
29f70 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
29f80 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29f90 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e  byte(pTemp)==pgn
29fa0 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20  oOld[i] );.     
29fb0 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65     if( !pOld->le
29fc0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
29fd0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
29fe0 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
29ff0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
2a000 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
2a010 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
2a020 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
2a030 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  eft.          **
2a040 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
2a050 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
2a060 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2a070 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
2a080 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c  &pOld->aData[pOl
2a090 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  d->hdrOffset+8],
2a0a0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
2a0b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2a0c0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
2a0d0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
2a0e0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
2a0f0 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
2a100 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2a110 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
2a120 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
2a130 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
2a140 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
2a150 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
2a160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2a170 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
2a180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a190 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
2a1a0 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
2a1b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
2a1c0 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
2a1d0 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
2a1e0 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
2a1f0 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
2a200 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
2a210 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
2a220 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
2a230 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
2a240 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
2a250 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
2a260 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
2a270 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
2a280 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
2a290 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
2a2a0 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
2a2b0 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
2a2c0 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
2a2d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
2a2e0 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
2a2f0 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
2a300 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
2a310 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
2a320 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
2a330 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
2a340 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
2a350 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
2a360 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
2a370 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
2a380 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
2a390 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
2a3a0 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
2a3b0 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
2a3c0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
2a3d0 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
2a3e0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
2a3f0 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
2a400 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
2a410 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
2a420 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
2a430 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
2a440 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
2a450 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
2a460 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2a470 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
2a480 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
2a490 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2a4a0 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
2a4b0 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
2a4c0 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
2a4d0 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
2a4e0 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
2a4f0 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
2a500 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
2a510 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
2a520 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
2a530 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
2a540 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
2a550 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
2a560 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a       k++;.    }.
2a570 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
2a580 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
2a590 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
2a5a0 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
2a5b0 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
2a5c0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
2a5d0 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
2a5e0 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
2a5f0 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
2a600 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
2a610 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
2a620 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
2a630 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
2a640 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
2a650 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
2a660 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
2a670 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
2a680 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
2a690 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
2a6a0 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
2a6b0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
2a6c0 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
2a6d0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
2a6e0 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
2a6f0 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
2a700 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
2a710 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
2a720 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
2a730 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
2a740 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
2a750 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
2a760 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
2a770 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
2a780 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
2a790 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
2a7a0 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
2a7b0 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
2a7c0 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
2a7d0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
2a7e0 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
2a7f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
2a800 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
2a810 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
2a820 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
2a830 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
2a840 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
2a850 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
2a860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a870 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
2a880 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
2a890 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
2a8a0 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
2a8b0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
2a8c0 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
2a8d0 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
2a8e0 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
2a8f0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
2a900 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
2a910 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
2a920 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
2a930 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
2a940 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
2a950 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
2a960 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
2a970 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
2a980 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
2a990 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
2a9a0 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
2a9b0 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
2a9c0 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
2a9d0 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
2a9e0 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
2a9f0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
2aa00 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
2aa10 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
2aa20 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
2aa30 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
2aa40 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
2aa50 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
2aa60 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
2aa70 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
2aa80 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
2aa90 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20  ])>0) or we are 
2aaa0 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75  the.  ** a virtu
2aab0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
2aac0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2aad0 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
2aae0 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
2aaf0 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
2ab00 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
2ab10 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
2ab20 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
2ab30 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
2ab40 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
2ab50 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
2ab60 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
2ab70 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
2ab80 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
2ab90 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
2aba0 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
2abb0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2abc0 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
2abd0 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50    pageFlags = pP
2abe0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  age->aData[0];. 
2abf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2ac00 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
2ac10 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
2ac20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
2ac30 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
2ac40 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
2ac50 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
2ac60 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20  gnoOld[i];.     
2ac70 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
2ac80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ac90 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
2aca0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2acb0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
2acc0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2acd0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2ace0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2acf0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
2ad00 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
2ad10 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2ad20 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
2ad30 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31  [i], pgnoNew[i-1
2ad40 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
2ad50 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2ad60 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2ad70 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
2ad80 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
2ad90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2ada0 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
2adb0 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
2adc0 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
2add0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
2ade0 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
2adf0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2ae00 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
2ae10 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2ae20 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2ae30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
2ae40 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
2ae50 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
2ae60 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
2ae70 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
2ae80 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
2ae90 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
2aea0 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
2aeb0 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
2aec0 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
2aed0 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
2aee0 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
2aef0 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
2af00 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
2af10 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
2af20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
2af30 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
2af40 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
2af50 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
2af60 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
2af70 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
2af80 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
2af90 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
2afa0 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
2afb0 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
2afc0 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
2afd0 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
2afe0 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
2aff0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
2b000 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
2b010 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
2b020 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
2b030 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
2b040 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
2b050 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
2b060 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
2b070 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
2b080 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
2b090 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
2b0a0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
2b0b0 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
2b0c0 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
2b0d0 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
2b0e0 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
2b0f0 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28  if( pgnoNew[j]<(
2b100 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
2b110 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
2b120 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
2b130 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20  = pgnoNew[j];.  
2b140 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b150 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
2b160 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
2b170 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
2b180 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b      t = pgnoNew[
2b190 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  i];.      pT = a
2b1a0 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pNew[i];.      p
2b1b0 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
2b1c0 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
2b1d0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
2b1e0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70  w[minI];.      p
2b1f0 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74  gnoNew[minI] = t
2b200 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
2b210 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
2b220 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
2b230 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
2b240 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64  d %d  new: %d(%d
2b250 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
2b260 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
2b270 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d  ,.    pgnoOld[0]
2b280 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
2b290 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c   pgnoOld[1] : 0,
2b2a0 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70  .    nOld>=3 ? p
2b2b0 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20  gnoOld[2] : 0,. 
2b2c0 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73     pgnoNew[0], s
2b2d0 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
2b2e0 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31  w>=2 ? pgnoNew[1
2b2f0 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  ] : 0, nNew>=2 ?
2b300 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
2b310 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e     nNew>=3 ? pgn
2b320 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[2] : 0, nNe
2b330 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
2b340 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
2b350 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20   ? pgnoNew[3] : 
2b360 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
2b370 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
2b380 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77  New>=5 ? pgnoNew
2b390 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  [4] : 0, nNew>=5
2b3a0 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
2b3b0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
2b3c0 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
2b3d0 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
2b3e0 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
2b3f0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
2b400 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
2b410 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
2b420 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
2b430 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
2b440 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
2b450 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
2b460 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
2b470 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
2b480 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
2b490 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
2b4a0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
2b4b0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
2b4c0 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d  ert( pNew->pgno=
2b4d0 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20  =pgnoNew[i] );. 
2b4e0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
2b4f0 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
2b500 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
2b510 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
2b520 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
2b530 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
2b540 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
2b550 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
2b560 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
2b570 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2b580 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
2b590 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ==0 );..    /* I
2b5a0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
2b5b0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
2b5c0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
2b5d0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
2b5e0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f  s.    ** that po
2b5f0 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69  int to the sibli
2b600 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65  ngs that were re
2b610 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20  arranged. These 
2b620 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20  can be: left.   
2b630 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   ** children of 
2b640 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74  cells, the right
2b650 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
2b660 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ge, or overflow 
2b670 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69  pages.    ** poi
2b680 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73  nted to by cells
2b690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2b6a0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2b6b0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20  .      for(k=j; 
2b6c0 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b  k<cntNew[i]; k++
2b6d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2b6e0 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( k<nMaxCells )
2b6f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  ;.        if( aF
2b700 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20  rom[k]==0xFF || 
2b710 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d  apCopy[aFrom[k]]
2b720 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
2b730 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  no ){.          
2b740 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
2b750 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20  fl(pNew, k-j);. 
2b760 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2b770 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65  =SQLITE_OK && le
2b780 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2b790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2b7a0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2b7b0 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65  t, get4byte(apCe
2b7c0 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ll[k]), PTRMAP_B
2b7d0 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  TREE, pNew->pgno
2b7e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2b7f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2b800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b810 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
2b820 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2b830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b840 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b850 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74    }..    j = cnt
2b860 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
2b870 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
2b880 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
2b890 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
2b8a0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
2b8b0 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
2b8c0 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
2b8d0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2b8e0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2b8f0 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26    if( i<nNew-1 &
2b900 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  & j<nCell ){.   
2b910 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
2b920 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
2b930 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
2b940 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
2b950 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
2b960 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
2b970 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
2b980 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
2b990 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2b9a0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
2b9b0 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20 20 20  2[iSpace2];.    
2b9c0 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
2b9d0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
2b9e0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
2b9f0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
2ba00 20 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55          if( ISAU
2ba10 54 4f 56 41 43 55 55 4d 20 0a 20 20 20 20 20 20  TOVACUUM .      
2ba20 20 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d     && (aFrom[j]=
2ba30 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
2ba40 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[j]]->pgno!
2ba50 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20  =pNew->pgno).   
2ba60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2ba70 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2ba80 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
2ba90 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54  Cell), PTRMAP_BT
2baa0 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
2bab0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bac0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2bad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2bae0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2baf0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
2bb00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2bb10 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
2bb20 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
2bb30 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
2bb40 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
2bb50 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
2bb60 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
2bb70 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
2bb80 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
2bb90 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
2bba0 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
2bbb0 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
2bbc0 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
2bbd0 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
2bbe0 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
2bbf0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
2bc00 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
2bc10 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
2bc20 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
2bc30 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
2bc40 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
2bc50 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
2bc60 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  --;.        sqli
2bc70 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
2bc80 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
2bc90 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
2bca0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
2bcb0 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 72 63 20  emp;.        rc 
2bcc0 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
2bcd0 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20  rent, pCell, 0, 
2bce0 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
2bcf0 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20   0, &sz);.      
2bd00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bd10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2bd20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2bd30 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
2bd40 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
2bd50 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2bd60 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
2bd70 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
2bd80 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
2bd90 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
2bda0 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
2bdb0 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
2bdc0 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
2bdd0 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
2bde0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
2bdf0 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
2be00 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
2be10 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
2be20 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
2be30 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
2be40 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
2be50 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65  (see sqlite3Btre
2be60 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
2be70 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
2be80 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
2be90 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
2bea0 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
2beb0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
2bec0 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
2bed0 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
2bee0 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
2bef0 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
2bf00 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
2bf10 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
2bf20 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
2bf30 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
2bf40 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
2bf50 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
2bf60 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
2bf70 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
2bf80 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
2bf90 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
2bfa0 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
2bfb0 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
2bfc0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
2bfd0 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
2bfe0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2bff0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2c000 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
2c010 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
2c020 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
2c030 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
2c040 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
2c050 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
2c060 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c070 20 20 20 69 53 70 61 63 65 32 20 2b 3d 20 73 7a     iSpace2 += sz
2c080 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c090 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
2c0a0 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
2c0b0 65 72 74 28 20 69 53 70 61 63 65 32 3c 3d 70 42  ert( iSpace2<=pB
2c0c0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
2c0d0 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
2c0e0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
2c0f0 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
2c100 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20  pTemp, 4);.     
2c110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c120 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
2c130 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2c140 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c150 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c160 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2c170 65 29 20 29 3b 0a 20 20 20 20 20 20 70 75 74 34  e) );.      put4
2c180 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
2c190 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78  wCell(pParent,nx
2c1a0 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Div), pNew->pgno
2c1b0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2c1c0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2c1d0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2c1e0 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
2c1f0 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
2c200 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
2c210 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
2c220 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
2c230 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
2c240 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
2c250 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
2c260 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
2c270 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
2c280 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2c290 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20  ISAUTOVACUUM && 
2c2a0 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20  !leafData ){.   
2c2b0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2c2c0 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c  PutOvfl(pParent,
2c2d0 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20   nxDiv);.       
2c2e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c2f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c300 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2c310 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
2c320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b        }.      j+
2c330 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
2c340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2c350 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
2c360 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68  map entry for th
2c370 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
2c380 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ge. */.    if( I
2c390 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2c3a0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2c3b0 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70  Put(pBt, pNew->p
2c3c0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
2c3d0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
2c3e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2c3f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c400 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2c410 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2c420 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2c430 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
2c440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
2c450 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
2c460 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
2c470 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
2c480 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
2c490 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
2c4a0 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
2c4b0 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
2c4c0 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
2c4d0 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
2c4e0 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20  zChild, 4);.    
2c4f0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2c500 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2c510 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
2c520 74 34 62 79 74 65 28 7a 43 68 69 6c 64 29 2c 20  t4byte(zChild), 
2c530 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
2c540 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
2c550 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2c560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c570 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2c580 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2c590 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2c5a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c5b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c5c0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2c5d0 65 29 20 29 3b 0a 20 20 69 66 28 20 6e 78 44 69  e) );.  if( nxDi
2c5e0 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  v==pParent->nCel
2c5f0 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  l+pParent->nOver
2c600 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52  flow ){.    /* R
2c610 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2c620 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  g is the right-m
2c630 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ost child of pPa
2c640 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34  rent */.    put4
2c650 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2c660 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2c670 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2c680 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
2c690 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69  }else{.    /* Ri
2c6a0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
2c6b0 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68 69   is the left chi
2c6c0 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ld of the first 
2c6d0 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74  entry in pParent
2c6e0 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
2c6f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69   right-most divi
2c700 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  der entry */.   
2c710 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
2c720 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
2c730 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f  nt, nxDiv), pgno
2c740 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
2c750 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c  }..  /*.  ** Bal
2c760 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
2c770 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  page.  Note that
2c780 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2c790 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a  e (pPage) might.
2c7a0 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61    ** have been a
2c7b0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
2c7c0 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74  list so it might
2c7d0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e   no longer be in
2c7e0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
2c7f0 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  But the parent p
2c800 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  age will always 
2c810 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
2c820 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2c830 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
2c840 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  ;.  sqlite3Scrat
2c850 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
2c860 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20    apCell = 0;.  
2c870 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2c880 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25   finished with %
2c890 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
2c8a0 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
2c8b0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
2c8c0 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c  gno, nOld, nNew,
2c8d0 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 70 50 61 67   nCell));.  pPag
2c8e0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
2c8f0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
2c900 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
2c910 69 50 61 67 65 2d 2d 3b 0a 20 20 72 63 20 3d 20  iPage--;.  rc = 
2c920 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
2c930 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43  ;.  .  /*.  ** C
2c940 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65  leanup before re
2c950 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61  turning..  */.ba
2c960 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  lance_cleanup:. 
2c970 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
2c980 28 61 53 70 61 63 65 32 29 3b 0a 20 20 73 71 6c  (aSpace2);.  sql
2c990 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
2c9a0 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
2c9b0 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
2c9c0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
2c9d0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
2c9e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
2c9f0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
2ca00 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
2ca10 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  i]);.  }.  pCur-
2ca20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ca30 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  age]->nOverflow 
2ca40 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  = 0;..  return r
2ca50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2ca60 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2ca70 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ed for the root 
2ca80 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
2ca90 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
2caa0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2cab0 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69  o cells.  This i
2cac0 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  s an opportunity
2cad0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65   to make the tre
2cae0 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62  e.** shallower b
2caf0 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  y one level..*/.
2cb00 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2cb10 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42 74 43  ce_shallower(BtC
2cb20 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2cb30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb50 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 42 2d 54  Root page of B-T
2cb60 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
2cb70 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20   *pChild;       
2cb80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
2cb90 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20  y child page of 
2cba0 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  pPage */.  Pgno 
2cbb0 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20  pgnoChild;      
2cbc0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2cbd0 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c  number for pChil
2cbe0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  d */.  int rc = 
2cbf0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2cc00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2cc10 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  de from subproce
2cc20 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61  dures */.  BtSha
2cc30 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2cc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2cc50 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72  e main BTree str
2cc60 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
2cc70 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20  mxCellPerPage;  
2cc80 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2cc90 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  mum number of ce
2cca0 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a  lls per page */.
2ccb0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
2ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ccd0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d  * All cells from
2cce0 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
2ccf0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
2cd00 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
2cd10 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
2cd20 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2cd30 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ls */..  assert(
2cd40 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2cd50 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2cd60 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 0a 20  r->apPage[0];.. 
2cd70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2cd80 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2cd90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2cda0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2cdb0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2cdc0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2cdd0 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61  t;.  mxCellPerPa
2cde0 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74  ge = MX_CELL(pBt
2cdf0 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  );.  apCell = sq
2ce00 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43  lite3Malloc( mxC
2ce10 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65  ellPerPage*(size
2ce20 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75  of(u8*)+sizeof(u
2ce30 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70  16)) );.  if( ap
2ce40 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
2ce50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2ce60 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2ce70 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65  &apCell[mxCellPe
2ce80 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50  rPage];.  if( pP
2ce90 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2cea0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73   /* The table is
2ceb0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
2cec0 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28  y */.    TRACE((
2ced0 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20  "BALANCE: empty 
2cee0 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61  table %d\n", pPa
2cef0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
2cf00 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
2cf10 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
2cf20 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63  ty but has one c
2cf30 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20  hild.  Transfer 
2cf40 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  the.    ** infor
2cf50 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74  mation from that
2cf60 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20   one child into 
2cf70 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66  the root page if
2cf80 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
2cf90 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75   fit.  This redu
2cfa0 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  ces the depth of
2cfb0 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65   the tree by one
2cfc0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2cfd0 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
2cfe0 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68   is page 1, it h
2cff0 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76  as less space av
2d000 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20  ailable than.   
2d010 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64   ** its child (d
2d020 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79  ue to the 100 by
2d030 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  te header that o
2d040 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67  ccurs at the beg
2d050 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66  inning.    ** of
2d060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c   the database fl
2d070 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20  e), so it might 
2d080 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68  not be able to h
2d090 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a  old all of the .
2d0a0 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2d0b0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  on currently con
2d0c0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68  tained in the ch
2d0d0 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73  ild.  If this is
2d0e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73   the .    ** cas
2d0f0 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64  e, then do not d
2d100 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20  o the transfer. 
2d110 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d   Leave page 1 em
2d120 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a  pty except.    *
2d130 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  * for the right-
2d140 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
2d150 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2d160 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d  child page becom
2d170 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69  es.    ** the vi
2d180 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  rtual root of th
2d190 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20  e tree..    */. 
2d1a0 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75     VVA_ONLY( pCu
2d1b0 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
2d1c0 20 3d 20 31 20 29 3b 0a 20 20 20 20 70 67 6e 6f   = 1 );.    pgno
2d1d0 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
2d1e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2d1f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2d200 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
2d210 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a   pgnoChild>0 );.
2d220 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2d230 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65  Child<=pagerPage
2d240 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74  count(pPage->pBt
2d250 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
2d260 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2d270 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  e(pPage->pBt, pg
2d280 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64  noChild, &pChild
2d290 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2d2a0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
2d2b0 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
2d2c0 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f   if( pPage->pgno
2d2d0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==1 ){.      rc 
2d2e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2d2f0 69 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  itPage(pChild);.
2d300 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2d310 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
2d320 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61  balance;.      a
2d330 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2d340 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
2d350 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d       if( pChild-
2d360 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20  >nFree>=100 ){. 
2d370 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
2d380 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ild information 
2d390 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2d3a0 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f  root page, so do
2d3b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2d3c0 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  copy */.        
2d3d0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a  int i;.        z
2d3e0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2d3f0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29  Child->aData[0])
2d400 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2d410 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65  0; i<pChild->nCe
2d420 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
2d430 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20      apCell[i] = 
2d440 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c  findCell(pChild,
2d450 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  i);.          sz
2d460 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  Cell[i] = cellSi
2d470 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70  zePtr(pChild, ap
2d480 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Cell[i]);.      
2d490 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2d4a0 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20  mblePage(pPage, 
2d4b0 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61  pChild->nCell, a
2d4c0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a  pCell, szCell);.
2d4d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
2d4e0 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
2d4f0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74  r of the child t
2d500 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f  o the parent. */
2d510 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d520 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2d530 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2d540 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2d550 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2d560 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2d570 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2d580 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
2d590 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61  4byte(&pChild->a
2d5a0 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72  Data[pChild->hdr
2d5b0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
2d5c0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2d5d0 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
2d5e0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2d5f0 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72  NCE: child %d tr
2d600 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31  ansfer to page 1
2d610 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
2d620 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  o));.      }else
2d630 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2d640 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20   child has more 
2d650 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
2d660 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2d670 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a   root..        *
2d680 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c  * The tree is al
2d690 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20  ready balanced. 
2d6a0 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   Do nothing. */.
2d6b0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2d6c0 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
2d6d0 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  d will not fit o
2d6e0 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  n page 1\n", pCh
2d6f0 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2d700 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2d710 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
2d720 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c  ge->aData, pChil
2d730 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d  d->aData, pPage-
2d740 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2d750 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
2d760 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
2d770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2d780 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
2d790 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
2d7a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d7b0 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67  );.      freePag
2d7c0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
2d7d0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2d7e0 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64  : transfer child
2d7f0 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64   %d into root %d
2d800 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2d810 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c     pChild->pgno,
2d820 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
2d830 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2d840 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2d850 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  ow==0 );.#ifndef
2d860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d870 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2d880 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20  ISAUTOVACUUM && 
2d890 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d8a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 43  .      rc = setC
2d8b0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 50 61 67  hildPtrmaps(pPag
2d8c0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
2d8d0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2d8e0 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e  (pChild);.  }.en
2d8f0 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2d900 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  e:.  sqlite3_fre
2d910 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e(apCell);.  ret
2d920 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2d930 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
2d940 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a  is overfull.**.*
2d950 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70  * When this happ
2d960 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65  ens, Create a ne
2d970 77 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64  w child page and
2d980 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e   copy the.** con
2d990 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f  tents of the roo
2d9a0 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64  t into the child
2d9b0 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65  .  Then make the
2d9c0 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e   root.** page an
2d9d0 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68   empty page with
2d9e0 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e   rightChild poin
2d9f0 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a  ting to the new.
2da00 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61  ** child.   Fina
2da10 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  lly, call balanc
2da20 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20  e_internal() on 
2da30 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a  the new child.**
2da40 20 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20   to cause it to 
2da50 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  split..*/.static
2da60 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
2da70 70 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  per(BtCursor *pC
2da80 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ur){.  int rc;  
2da90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2daa0 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
2dab0 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
2dac0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2dad0 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  e;     /* Pointe
2dae0 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
2daf0 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
2db00 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50  *pChild;    /* P
2db10 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
2db20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2db30 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
2db40 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2db50 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
2db60 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
2db70 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
2db80 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
2db90 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
2dba0 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f  eSize;     /* To
2dbb0 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20  tal usable size 
2dbc0 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75  of a page */.  u
2dbd0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
2dbe0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2dbf0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2dc00 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b   */.  u8 *cdata;
2dc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2dc20 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c  tent of the chil
2dc30 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2dc40 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
2dc50 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
2dc60 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65  e header in pare
2dc70 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  nt */.  int cbrk
2dc80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
2dc90 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74  ffset to content
2dca0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69   of first cell i
2dcb0 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61  n parent */..  a
2dcc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2dcd0 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
2dce0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2dcf0 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  0]->nOverflow>0 
2dd00 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  );..  VVA_ONLY( 
2dd10 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
2dd20 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 70 50 61  led = 1 );.  pPa
2dd30 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2dd40 65 5b 30 5d 3b 0a 20 20 70 42 74 20 3d 20 70 50  e[0];.  pBt = pP
2dd50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
2dd60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2dd70 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2dd80 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2dd90 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2dda0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2ddb0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 63 20  DbPage) );.  rc 
2ddc0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2ddd0 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64  age(pBt, &pChild
2dde0 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50  , &pgnoChild, pP
2ddf0 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  age->pgno, 0);. 
2de00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2de10 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
2de20 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2de30 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
2de40 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61  DbPage) );.  usa
2de50 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
2de60 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
2de70 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2de80 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2de90 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 62  >hdrOffset;.  cb
2dea0 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
2deb0 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63  ata[hdr+5]);.  c
2dec0 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61  data = pChild->a
2ded0 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63  Data;.  memcpy(c
2dee0 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d  data, &data[hdr]
2def0 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  , pPage->cellOff
2df00 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
2df10 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70  ll-hdr);.  memcp
2df20 79 28 26 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20  y(&cdata[cbrk], 
2df30 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
2df40 62 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a  bleSize-cbrk);..
2df50 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
2df60 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
2df70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2df80 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2df90 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2dfa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2dfb0 6e 74 20 6e 43 6f 70 79 20 3d 20 70 50 61 67 65  nt nCopy = pPage
2dfc0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
2dfd0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2dfe0 30 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  0]);.    memcpy(
2dff0 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70  pChild->aOvfl, p
2e000 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f  Page->aOvfl, nCo
2e010 70 79 29 3b 0a 20 20 20 20 70 43 68 69 6c 64 2d  py);.    pChild-
2e020 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61  >nOverflow = pPa
2e030 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ge->nOverflow;. 
2e040 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
2e050 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2e060 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
2e070 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 0;.    }.    a
2e080 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2e090 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  Cell==pPage->nCe
2e0a0 6c 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ll );.    assert
2e0b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2e0c0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2e0d0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2e0e0 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2e0f0 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
2e100 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a  ] & ~PTF_LEAF);.
2e110 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2e120 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2e130 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2e140 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20  pgnoChild);.    
2e150 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2e160 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
2e170 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  to %d\n", pPage-
2e180 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
2e190 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28 20 49  gno));.    if( I
2e1a0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2e1b0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2e1c0 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d  Put(pBt, pChild-
2e1d0 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2e1e0 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  REE, pPage->pgno
2e1f0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2e200 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2e210 4d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  M.      if( rc==
2e220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e230 20 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69       rc = setChi
2e240 6c 64 50 74 72 6d 61 70 73 28 70 43 68 69 6c 64  ldPtrmaps(pChild
2e250 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e260 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e270 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72     pChild->nOver
2e280 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  flow = 0;.      
2e290 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
2e2a0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
2e2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2e2c0 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20  Cur->iPage++;.  
2e2d0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31    pCur->apPage[1
2e2e0 5d 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 20 20  ] = pChild;.    
2e2f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
2e300 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   0;.    rc = bal
2e310 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75  ance_nonroot(pCu
2e320 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2e330 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
2e340 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ild);.  }..  ret
2e350 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e360 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70   The page that p
2e370 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  Cur currently po
2e380 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74  ints to has just
2e390 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69   been modified i
2e3a0 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54  n.** some way. T
2e3b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67  his function fig
2e3c0 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73  ures out if this
2e3d0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65   modification me
2e3e0 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20  ans the.** tree 
2e3f0 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
2e400 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nced, and if so 
2e410 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70  calls the approp
2e420 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
2e430 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  .** routine..** 
2e440 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73  .** Parameter is
2e450 49 6e 73 65 72 74 20 69 73 20 74 72 75 65 20 69  Insert is true i
2e460 66 20 61 20 6e 65 77 20 63 65 6c 6c 20 77 61 73  f a new cell was
2e470 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 69   just inserted i
2e480 6e 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 2c  nto the.** page,
2e490 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2e4a0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
2e4b0 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
2e4c0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 69  sor *pCur, int i
2e4d0 73 49 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20  sInsert){.  int 
2e4e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e4f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e500 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2e510 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20  pCur->iPage];.. 
2e520 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e530 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2e540 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2e550 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
2e560 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  age==0 ){.    rc
2e570 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2e580 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2e590 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2e5a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2e5b0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2e5c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2e5d0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
2e5e0 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Cur);.      asse
2e5f0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2e600 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20  [0]==pPage );.  
2e610 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e620 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2e630 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
2e640 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
2e650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e660 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  && pPage->nCell=
2e670 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2e680 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2e690 65 72 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  er(pCur);.      
2e6a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2e6b0 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29  Page[0]==pPage )
2e6c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e6d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2e6e0 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  ==0 || rc!=SQLIT
2e6f0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20  E_OK );.    }.  
2e700 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
2e710 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2e720 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21  0 || .        (!
2e730 69 73 49 6e 73 65 72 74 20 26 26 20 70 50 61 67  isInsert && pPag
2e740 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
2e750 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2e760 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
2e770 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
2e780 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  ot(pCur);.    }.
2e790 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e7a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2e7b0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c  outine checks al
2e7c0 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70  l cursors that p
2e7d0 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67  oint to table pg
2e7e0 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e  noRoot..** If an
2e7f0 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f  y of those curso
2e800 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77  rs were opened w
2e810 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e  ith wrFlag==0 in
2e820 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
2e830 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2e840 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20  ion (a database 
2e850 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
2e860 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72  shares the pager
2e870 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74  .** cache with t
2e880 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65  he current conne
2e890 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20  ction) and that 
2e8a0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2e8b0 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74   .** is not in t
2e8c0 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74  he ReadUncommmit
2e8d0 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ted state, then 
2e8e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2e8f0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
2e900 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73  LOCKED..**.** As
2e910 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73   well as cursors
2e920 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c   with wrFlag==0,
2e930 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72   cursors with wr
2e940 46 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20  Flag==1 and .** 
2e950 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2e960 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e  ==1 are also con
2e970 73 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63  sidered 'read' c
2e980 75 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e  ursors. Incremen
2e990 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72  tal .** blob cur
2e9a0 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f  sors are used fo
2e9b0 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
2e9c0 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  nd writing..**.*
2e9d0 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20  * When pgnoRoot 
2e9e0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
2e9f0 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   of an intkey ta
2ea00 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ble, this functi
2ea10 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65  on is also.** re
2ea20 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e  sponsible for in
2ea30 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65  validating incre
2ea40 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2ea50 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61 62  ors when the tab
2ea60 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69  le row.** on whi
2ea70 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e  ch they are open
2ea80 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72  ed is deleted or
2ea90 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f   modified. Curso
2eaa0 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
2eab0 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20  ed.** according 
2eac0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2ead0 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
2eae0 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65  1) When BtreeCle
2eaf0 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c  arTable() is cal
2eb00 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  led to completel
2eb10 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e  y delete the con
2eb20 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66  tents.**      of
2eb30 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c   a B-Tree table,
2eb40 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74   pExclude is set
2eb50 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72   to zero and par
2eb60 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a  ameter iRow is .
2eb70 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e  **      set to n
2eb80 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  on-zero. In this
2eb90 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d   case all increm
2eba0 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2ebb0 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20  rs open.**      
2ebc0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  on the table roo
2ebd0 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  ted at pgnoRoot 
2ebe0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
2ebf0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
2ec00 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20   BtreeInsert(), 
2ec10 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
2ec20 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29 20   BtreePutData() 
2ec30 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a  is called to .**
2ec40 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74        modify a t
2ec50 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20  able row via an 
2ec60 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70  SQL statement, p
2ec70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
2ec80 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77  o the .**      w
2ec90 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65 64  rite cursor used
2eca0 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66   to do the modif
2ecb0 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61  ication and para
2ecc0 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73 65  meter iRow is se
2ecd0 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  t.**      to the
2ece0 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20   integer row id 
2ecf0 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e  of the B-Tree en
2ed00 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  try being modifi
2ed10 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20  ed. Unless.**   
2ed20 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69     pExclude is i
2ed30 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65  tself an increme
2ed40 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2ed50 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65  , then all incre
2ed60 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62  mental.**      b
2ed70 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
2ed80 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20   on row iRow of 
2ed90 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20 69  the B-Tree are i
2eda0 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a  nvalidated..**.*
2edb0 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20 70  *   3) If both p
2edc0 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77  Exclude and iRow
2edd0 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f   are set to zero
2ede0 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  , no incremental
2edf0 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63   blob .**      c
2ee00 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
2ee10 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
2ee20 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
2ee30 6f 63 6b 73 28 0a 20 20 42 74 72 65 65 20 2a 70  ocks(.  Btree *p
2ee40 42 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70  Btree, .  Pgno p
2ee50 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75  gnoRoot, .  BtCu
2ee60 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a  rsor *pExclude,.
2ee70 20 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20    i64 iRow.){.  
2ee80 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
2ee90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2eea0 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71  Btree->pBt;.  sq
2eeb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72  lite3 *db = pBtr
2eec0 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  ee->db;.  assert
2eed0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2eee0 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
2eef0 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
2ef00 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
2ef10 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ef20 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20  ( p==pExclude ) 
2ef30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2ef40 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70  ( p->pgnoRoot!=p
2ef50 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e  gnoRoot ) contin
2ef60 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
2ef70 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2ef80 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e  .    if( p->isIn
2ef90 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
2efa0 28 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45  ( .         (!pE
2efb0 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a  xclude && iRow).
2efc0 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75        || (pExclu
2efd0 64 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d  de && !pExclude-
2efe0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2eff0 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65  e && p->info.nKe
2f000 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b  y==iRow).    )){
2f010 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
2f020 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2f030 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  D;.    }.#endif.
2f040 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
2f050 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2f060 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f070 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30  if( p->wrFlag==0
2f080 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
2f090 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2f0a0 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72      || p->isIncr
2f0b0 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69  blobHandle.#endi
2f0c0 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  f.    ){.      s
2f0d0 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20  qlite3 *dbOther 
2f0e0 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  = p->pBtree->db;
2f0f0 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68  .      if( dbOth
2f100 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  er==0 ||.       
2f110 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26    (dbOther!=db &
2f120 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67  & (dbOther->flag
2f130 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
2f140 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20  ncommitted)==0) 
2f150 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2f160 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2f170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f180 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2f190 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2f1a0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
2f1b0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
2f1c0 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
2f1d0 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
2f1e0 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
2f1f0 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
2f200 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
2f210 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
2f220 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
2f230 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
2f240 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
2f250 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
2f260 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
2f270 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2f280 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2f290 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
2f2a0 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
2f2b0 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
2f2c0 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
2f2d0 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
2f2e0 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
2f2f0 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
2f300 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
2f310 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
2f320 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
2f330 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2f340 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
2f350 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2f360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f370 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2f380 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
2f390 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2f3a0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2f3b0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2f3c0 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
2f3d0 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
2f3e0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2f3f0 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
2f400 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
2f410 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
2f420 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f440 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
2f450 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
2f460 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
2f470 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
2f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f490 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2f4a0 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
2f4b0 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
2f4c0 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
2f4d0 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69    int szNew;.  i
2f4e0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
2f4f0 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65  e *pPage;.  Btre
2f500 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
2f510 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
2f520 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2f530 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2f540 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67  oldCell;.  unsig
2f550 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c  ned char *newCel
2f560 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
2f570 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2f580 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2f590 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
2f5a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2f5b0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
2f5c0 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
2f5d0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
2f5e0 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20  Cur->wrFlag );. 
2f5f0 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2f600 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2f610 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2f620 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 20 29 7b  , pCur, nKey) ){
2f630 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2f640 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
2f650 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
2f660 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
2f670 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  d lock */.  }.  
2f680 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2f690 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
2f6a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
2f6b0 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20  r->skip;.  }..  
2f6c0 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
2f6d0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
2f6e0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
2f6f0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  on this table */
2f700 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  .  sqlite3BtreeC
2f710 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
2f720 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c  ;.  if( .    SQL
2f730 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
2f740 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2f750 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2f760 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
2f770 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2f780 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2f790 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
2f7a0 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73  nKey, appendBias
2f7b0 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20  , &loc)).  ){.  
2f7c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2f7d0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2f7e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2f7f0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2f800 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
2f810 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
2f820 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
2f830 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e  af || !pPage->in
2f840 74 4b 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28  tKey );.  TRACE(
2f850 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d  ("INSERT: table=
2f860 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61  %d nkey=%lld nda
2f870 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73  ta=%d page=%d %s
2f880 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
2f890 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
2f8a0 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67  Key, nData, pPag
2f8b0 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  e->pgno,.       
2f8c0 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65     loc==0 ? "ove
2f8d0 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65  rwrite" : "new e
2f8e0 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72  ntry"));.  asser
2f8f0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2f900 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65   );.  allocateTe
2f910 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
2f920 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  newCell = pBt->p
2f930 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20  TmpSpace;.  if( 
2f940 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
2f950 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2f960 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
2f970 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
2f980 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
2f990 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a  pData, nData, nZ
2f9a0 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ero, &szNew);.  
2f9b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2f9c0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
2f9d0 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
2f9e0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
2f9f0 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
2fa00 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
2fa10 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
2fa20 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
2fa30 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2fa40 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26  ;.  if( loc==0 &
2fa50 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  & CURSOR_VALID==
2fa60 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2fa70 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20      u16 szOld;. 
2fa80 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70     assert( idx<p
2fa90 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2faa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2fab0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2fac0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2fad0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67  f( rc ){.      g
2fae0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2faf0 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c      }.    oldCel
2fb00 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
2fb10 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66  ge, idx);.    if
2fb20 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2fb30 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e  {.      memcpy(n
2fb40 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c  ewCell, oldCell,
2fb50 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   4);.    }.    s
2fb60 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50  zOld = cellSizeP
2fb70 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  tr(pPage, oldCel
2fb80 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  l);.    rc = cle
2fb90 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c  arCell(pPage, ol
2fba0 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  dCell);.    if( 
2fbb0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
2fbc0 73 65 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 64  sert;.    rc = d
2fbd0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
2fbe0 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20  dx, szOld);.    
2fbf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fc00 4b 20 29 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f  K ) {.      goto
2fc10 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
2fc20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c   }.  }else if( l
2fc30 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  oc<0 && pPage->n
2fc40 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73  Cell>0 ){.    as
2fc50 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2fc60 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b  f );.    idx = +
2fc70 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
2fc80 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 70  r->iPage];.    p
2fc90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2fca0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
2fcb0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
2fcc0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2fcd0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
2fce0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73  ;.  }.  rc = ins
2fcf0 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ertCell(pPage, i
2fd00 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e  dx, newCell, szN
2fd10 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  ew, 0, 0);.  if(
2fd20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2fd30 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  {.    rc = balan
2fd40 63 65 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 7d  ce(pCur, 1);.  }
2fd50 0a 0a 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65  ..  /* Must make
2fd60 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20   sure nOverflow 
2fd70 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f  is reset to zero
2fd80 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c   even if the bal
2fd90 61 6e 63 65 28 29 0a 20 20 2a 2a 20 66 61 69 6c  ance().  ** fail
2fda0 73 2e 20 20 49 6e 74 65 72 6e 61 6c 20 64 61 74  s.  Internal dat
2fdb0 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  a structure corr
2fdc0 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  uption will resu
2fdd0 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f  lt otherwise. */
2fde0 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  .  pCur->apPage[
2fdf0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f  pCur->iPage]->nO
2fe00 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
2fe10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fe20 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2fe30 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65  oot(pCur);.  }.e
2fe40 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74  nd_insert:.  ret
2fe50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2fe60 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72   Delete the entr
2fe70 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
2fe80 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
2fe90 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2fea0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2feb0 67 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79  g at a arbitrary
2fec0 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   location..*/.in
2fed0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  t sqlite3BtreeDe
2fee0 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70  lete(BtCursor *p
2fef0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2ff00 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
2ff10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2ff20 65 5d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  e];.  int idx;. 
2ff30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2ff40 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  pCell;.  int rc;
2ff50 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2ff60 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a  d = 0;.  Btree *
2ff70 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
2ff80 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2ff90 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
2ffa0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2ffb0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2ffc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ffd0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2ffe0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
2fff0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
30000 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
30010 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
30020 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  y );.  if( pCur-
30030 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
30040 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
30050 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
30060 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28    }.  if( NEVER(
30070 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
30080 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
30090 3e 6e 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20 72  >nCell) ){.    r
300a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
300b0 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73  OR;  /* The curs
300c0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
300d0 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a  ng to anything *
300e0 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  /.  }.  assert( 
300f0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a  pCur->wrFlag );.
30100 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
30110 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65  ocks(pCur->pBtre
30120 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
30130 74 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69  t, pCur, pCur->i
30140 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20 20 20  nfo.nKey) ){.   
30150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
30160 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
30170 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
30180 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
30190 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ck */.  }..  /* 
301a0 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  Restore the curr
301b0 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
301c0 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20  ion (a no-op if 
301d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
301e0 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f  t in .  ** CURSO
301f0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
30200 61 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68  ate) and save th
30210 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
30220 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
30230 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74   .  ** open on t
30240 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54  he same table. T
30250 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
30260 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
30270 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68  the page.  ** th
30280 61 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c  at the entry wil
30290 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f  l be deleted fro
302a0 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  m..  */.  if( . 
302b0 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65     (rc = restore
302c0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
302d0 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
302e0 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
302f0 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
30300 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
30310 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
30320 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30330 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
30340 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  e))!=0.  ){.    
30350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
30360 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
30370 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20  cell within its 
30380 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70  page and leave p
30390 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f  Cell pointing to
303a0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20   the.  ** data. 
303b0 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20  The clearCell() 
303c0 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f  call frees any o
303d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
303e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
303f0 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  e.  ** cell. The
30400 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20   cell itself is 
30410 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20  still intact..  
30420 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d  */.  idx = pCur-
30430 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
30440 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  ge];.  pCell = f
30450 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
30460 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  dx);.  if( !pPag
30470 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
30480 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
30490 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  yte(pCell);.  }.
304a0 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
304b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
304c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
304d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
304e0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
304f0 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
30500 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
30510 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
30520 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
30530 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
30540 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
30550 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
30560 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
30570 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
30580 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
30590 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
305a0 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
305b0 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
305c0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
305d0 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
305e0 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
305f0 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
30600 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
30610 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
30620 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
30630 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
30640 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
30650 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
30660 4c 65 61 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20  LeafPage = 0;.. 
30670 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
30680 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
30690 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e   notUsed;.    un
306a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
306b0 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61  pCell = 0;.    a
306c0 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69  ssert( !pPage->i
306d0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  ntKey );.    sql
306e0 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70  ite3BtreeGetTemp
306f0 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65  Cursor(pCur, &le
30700 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d  afCur);.    rc =
30710 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
30720 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74  t(&leafCur, &not
30730 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
30740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
30760 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66  afCur.aiIdx[leaf
30770 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b  Cur.iPage]==0 );
30780 0a 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65  .      pLeafPage
30790 20 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67   = leafCur.apPag
307a0 65 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d  e[leafCur.iPage]
307b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
307c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
307d0 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67  LeafPage->pDbPag
307e0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
307f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30800 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61  ){.      int lea
30810 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d  fCursorInvalid =
30820 20 30 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   0;.      u16 sz
30830 4e 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43  Next;.      TRAC
30840 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
30850 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65  e=%d delete inte
30860 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70  rnal from %d rep
30870 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lace from leaf %
30880 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
30890 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
308a0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61  Page->pgno, pLea
308b0 66 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  fPage->pgno));. 
308c0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
308d0 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69  age, idx, cellSi
308e0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
308f0 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
30900 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65  t = findCell(pLe
30910 61 66 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  afPage, 0);.    
30920 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53    szNext = cellS
30930 69 7a 65 50 74 72 28 70 4c 65 61 66 50 61 67 65  izePtr(pLeafPage
30940 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  , pNext);.      
30950 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f  assert( MX_CELL_
30960 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78  SIZE(pBt)>=szNex
30970 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  t+4 );.      all
30980 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
30990 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43  Bt);.      tempC
309a0 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
309b0 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20  pace;.      if( 
309c0 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  tempCell==0 ){. 
309d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
309e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
309f0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
30a00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30a10 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
30a20 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
30a30 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74   pNext-4, szNext
30a40 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29  +4, tempCell, 0)
30a50 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ;.      }...    
30a60 20 20 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74    /* The "if" st
30a70 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e  atement in the n
30a80 65 78 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69  ext code block i
30a90 73 20 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65  s critical.  The
30aa0 0a 20 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74  .      ** slight
30ab0 65 73 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61  est error in tha
30ac0 74 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c  t statement woul
30ad0 64 20 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74  d allow SQLite t
30ae0 6f 20 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20  o operate.      
30af0 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73  ** correctly mos
30b00 74 20 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75  t of the time bu
30b10 74 20 70 72 6f 64 75 63 65 20 76 65 72 79 20 72  t produce very r
30b20 61 72 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54  are failures.  T
30b30 6f 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64  o.      ** guard
30b40 20 61 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74   against this, t
30b50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
30b60 72 6f 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69  ros help to veri
30b70 66 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  fy that.      **
30b80 20 74 68 65 20 22 69 66 22 20 73 74 61 74 65 6d   the "if" statem
30b90 65 6e 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74  ent is well test
30ba0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
30bb0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
30bc0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
30bd0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
30be0 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  <pBt->usableSize
30bf0 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20  *2/3 .          
30c00 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
30c10 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
30c20 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
30c30 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
30c40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
30c50 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
30c60 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
30c70 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ==pBt->usableSiz
30c80 65 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20  e*2/3 .         
30c90 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66          && pLeaf
30ca0 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
30cb0 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
30cc0 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20  leSize*2/3 );.  
30cd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
30ce0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
30cf0 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  0 && pPage->nFre
30d00 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e==pBt->usableSi
30d10 7a 65 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20  ze*2/3+1 .      
30d20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c             && pL
30d30 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
30d40 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75  +szNext > pBt->u
30d50 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
30d60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
30d70 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30d80 77 3e 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  w>0 && pPage->nF
30d90 72 65 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ree<=pBt->usable
30da0 53 69 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20  Size*2/3.       
30db0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
30dc0 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
30dd0 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
30de0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
30df0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30e00 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  (pPage->nOverflo
30e10 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e  w>0 || (pPage->n
30e20 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62  Free > pBt->usab
30e30 6c 65 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20  leSize*2/3)).   
30e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
30e50 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
30e60 65 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42  e+2+szNext == pB
30e70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
30e80 33 20 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28  3 );...      if(
30e90 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c   (pPage->nOverfl
30ea0 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e  ow>0 || (pPage->
30eb0 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61  nFree > pBt->usa
30ec0 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26  bleSize*2/3)) &&
30ed0 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 65 61  .          (pLea
30ee0 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
30ef0 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
30f00 62 6c 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20  bleSize*2/3).   
30f10 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
30f20 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
30f30 74 61 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74  taken if the int
30f40 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f  ernal node is no
30f50 77 20 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f  w either overflo
30f60 77 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  wing.        ** 
30f70 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64  or underfull and
30f80 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77   the leaf node w
30f90 69 6c 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c  ill be underfull
30fa0 20 61 66 74 65 72 20 74 68 65 20 6a 75 73 74 20   after the just 
30fb0 63 65 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  cell .        **
30fc0 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69   copied to the i
30fd0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20  nternal node is 
30fe0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e  deleted from it.
30ff0 20 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69   This is a speci
31000 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  al.        ** ca
31010 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  se because the c
31020 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29  all to balance()
31030 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20   to correct the 
31040 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20  internal node.  
31050 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61        ** may cha
31060 6e 67 65 20 74 68 65 20 74 72 65 65 20 73 74 72  nge the tree str
31070 75 63 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c  ucture and inval
31080 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
31090 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ts of.        **
310a0 20 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50   the leafCur.apP
310b0 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75  age[] and leafCu
310c0 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  r.aiIdx[] arrays
310d0 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a  , which will be.
310e0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20          ** used 
310f0 62 79 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  by the balance()
31100 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72   required to cor
31110 72 65 63 74 20 74 68 65 20 75 6e 64 65 72 66 75  rect the underfu
31120 6c 6c 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20  ll leaf.        
31130 2a 2a 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20  ** node..       
31140 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
31150 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
31160 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
31170 6e 20 61 62 6f 76 65 20 61 72 65 20 62 61 73 65  n above are base
31180 64 20 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20  d on facets of. 
31190 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
311a0 4c 69 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74  Lite file-format
311b0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61   that do not cha
311c0 6e 67 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20  nge over time.. 
311d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
311e0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
311f0 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75  e->nFree==pBt->u
31200 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20  sableSize*2/3+1 
31210 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
31220 61 73 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e  ase( pLeafPage->
31230 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d  nFree+2+szNext==
31240 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
31250 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  2/3+1 );.       
31260 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c   leafCursorInval
31270 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20  id = 1;.      } 
31280 20 20 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69         ..      i
31290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
312a0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
312b0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
312c0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
312d0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
312e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
312f0 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
31300 28 70 50 61 67 65 2c 20 69 64 78 29 2c 20 70 67  (pPage, idx), pg
31310 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  noChild);.      
31320 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
31330 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
31340 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  = 0 );.        r
31350 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
31360 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
31370 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31380 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75  ITE_OK && leafCu
31390 72 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20  rsorInvalid ){. 
313a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
313b0 61 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75  af-node is now u
313c0 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20  nderfull and so 
313d0 74 68 65 20 74 72 65 65 20 6e 65 65 64 73 20 74  the tree needs t
313e0 6f 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  o be .        **
313f0 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77   rebalanced. How
31400 65 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63  ever, the balanc
31410 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  e() operation on
31420 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20   the internal.  
31430 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62        ** node ab
31440 6f 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64  ove may have mod
31450 69 66 69 65 64 20 74 68 65 20 73 74 72 75 63 74  ified the struct
31460 75 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65  ure of the B-Tre
31470 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  e and.        **
31480 20 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   so the current 
31490 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66  contents of leaf
314a0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
314b0 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d   leafCur.aiIdx[]
314c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
314d0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
314e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
314f0 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20     ** It is not 
31500 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79  possible to copy
31510 20 74 68 65 20 61 6e 63 65 73 74 72 79 20 66 72   the ancestry fr
31520 6f 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65 20  om pCur, as the 
31530 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  same.        ** 
31540 62 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68  balance() call h
31550 61 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74  as invalidated t
31560 68 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  he pCur->apPage[
31570 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20  ] and aiIdx[].  
31580 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e        ** arrays.
31590 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
315a0 20 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c       ** The call
315b0 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f   to saveCursorPo
315c0 73 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69  sition() below i
315d0 6e 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20  nternally saves 
315e0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
315f0 6b 65 79 20 74 68 61 74 20 6c 65 61 66 43 75 72  key that leafCur
31600 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
31610 69 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65  inting to. Curre
31620 6e 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20  ntly, there.    
31630 20 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63      ** are two c
31640 6f 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65  opies of that ke
31650 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20  y in the tree - 
31660 6f 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20  one here on the 
31670 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  leaf.        ** 
31680 70 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20  page and one on 
31690 73 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  some internal no
316a0 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20  de in the tree. 
316b0 54 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20  The copy on.    
316c0 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20      ** the leaf 
316d0 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 74  node is always t
316e0 68 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74  he next key in t
316f0 72 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20  ree-order after 
31700 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
31710 63 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65  copy on the inte
31720 72 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74  rnal node. So, t
31730 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
31740 65 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20  e3BtreeNext().  
31750 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72        ** calls r
31760 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
31770 74 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20  tion() to point 
31780 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
31790 65 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a  e copy.        *
317a0 2a 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  * stored on the 
317b0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74  internal node, t
317c0 68 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20  hen advances to 
317d0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a  the next entry,.
317e0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68          ** which
317f0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
31800 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b  he copy of the k
31810 65 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e  ey on the intern
31820 61 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20  al node..       
31830 20 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20   ** Net effect: 
31840 6c 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74  leafCur is point
31850 69 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ing back to the 
31860 64 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20  duplicate cell. 
31870 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e         ** that n
31880 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76  eeds to be remov
31890 65 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ed, and the leaf
318a0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
318b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66  .        ** leaf
318c0 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61  Cur.aiIdx[] arra
318d0 79 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a  ys are correct..
318e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
318f0 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e     VVA_ONLY( Pgn
31900 6f 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65  o leafPgno = pLe
31910 61 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  afPage->pgno );.
31920 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
31930 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
31940 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20  &leafCur);.     
31950 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
31980 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
31990 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
319a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
319b0 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43  LeafPage = leafC
319c0 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75  ur.apPage[leafCu
319d0 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20  r.iPage];.      
319e0 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66 50    assert( pLeafP
319f0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50  age->pgno==leafP
31a00 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 61  gno );.        a
31a10 73 73 65 72 74 28 20 6c 65 61 66 43 75 72 2e 61  ssert( leafCur.a
31a20 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61  iIdx[leafCur.iPa
31a30 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ge]==0 );.      
31a40 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  }..      if( SQL
31a50 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20 20  ITE_OK==rc.     
31a60 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d    && SQLITE_OK==
31a70 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
31a80 65 72 57 72 69 74 65 28 70 4c 65 61 66 50 61 67  erWrite(pLeafPag
31a90 65 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20 20  e->pDbPage)) .  
31aa0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64      ){.        d
31ab0 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50 61 67  ropCell(pLeafPag
31ac0 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b 0a 20  e, 0, szNext);. 
31ad0 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28         VVA_ONLY(
31ae0 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53 68   leafCur.pagesSh
31af0 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20  uffled = 0 );.  
31b00 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
31b10 63 65 28 26 6c 65 61 66 43 75 72 2c 20 30 29 3b  ce(&leafCur, 0);
31b20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31b30 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c   leafCursorInval
31b40 69 64 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e 70  id || !leafCur.p
31b50 61 67 65 73 53 68 75 66 66 6c 65 64 0a 20 20 20  agesShuffled.   
31b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b80 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67 65 73 53  || !pCur->pagesS
31b90 68 75 66 66 6c 65 64 20 29 3b 0a 20 20 20 20 20  huffled );.     
31ba0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
31bb0 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65  ite3BtreeRelease
31bc0 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66  TempCursor(&leaf
31bd0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
31be0 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
31bf0 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
31c00 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c  te from leaf %d\
31c10 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d  n",.       pCur-
31c20 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
31c30 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72 63  ->pgno));.    rc
31c40 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67   = dropCell(pPag
31c50 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65  e, idx, cellSize
31c60 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
31c70 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ));.    if( rc==
31c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31c90 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
31ca0 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  pCur, 0);.    }.
31cb0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
31cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
31cd0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
31ce0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
31cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
31d00 65 20 61 20 6e 65 77 20 42 54 72 65 65 20 74 61  e a new BTree ta
31d10 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ble.  Write into
31d20 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70 61   *piTable the pa
31d30 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
31d40 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
31d50 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  f the new table.
31d60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20  .**.** The type 
31d70 6f 66 20 74 79 70 65 20 69 73 20 64 65 74 65 72  of type is deter
31d80 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61  mined by the fla
31d90 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f  gs parameter.  O
31da0 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  nly the.** follo
31db0 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66  wing values of f
31dc0 6c 61 67 73 20 61 72 65 20 63 75 72 72 65 6e 74  lags are current
31dd0 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65  ly in use.  Othe
31de0 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20  r values for.** 
31df0 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20  flags might not 
31e00 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  work:.**.**     
31e10 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52  BTREE_INTKEY|BTR
31e20 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20  EE_LEAFDATA     
31e30 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62  Used for SQL tab
31e40 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b  les with rowid k
31e50 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45  eys.**     BTREE
31e60 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20 20  _ZERODATA       
31e70 20 20 20 20 20 20 20 20 20 20 20 55 73 65 64 20             Used 
31e80 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a  for SQL indices.
31e90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
31ea0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
31eb0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
31ec0 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
31ed0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
31ee0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
31ef0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
31f00 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a   Pgno pgnoRoot;.
31f10 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
31f20 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
31f30 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
31f40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
31f50 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
31f60 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
31f70 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
31f80 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64  eadOnly );..#ifd
31f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31fa0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
31fb0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
31fc0 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
31fd0 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
31fe0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
31ff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
32000 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74  .#else.  if( pBt
32010 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
32020 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76      Pgno pgnoMov
32030 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  e;      /* Move 
32040 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d  a page here to m
32050 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
32060 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
32070 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32080 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67  Move; /* The pag
32090 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f  e to move to. */
320a0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e  ..    /* Creatin
320b0 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61  g a new table ma
320c0 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69  y probably requi
320d0 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69  re moving an exi
320e0 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20  sting database. 
320f0 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f     ** to make ro
32100 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  om for the new t
32110 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e  ables root page.
32120 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61   In case this pa
32130 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20  ge turns.    ** 
32140 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65  out to be an ove
32150 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65  rflow page, dele
32160 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  te all overflow 
32170 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a  page-map caches.
32180 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f      ** held by o
32190 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20  pen cursors..   
321a0 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   */.    invalida
321b0 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
321c0 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a  he(pBt);..    /*
321d0 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   Read the value 
321e0 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20  of meta[3] from 
321f0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
32200 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20  determine where 
32210 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
32220 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
32230 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e  table should go.
32240 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20   meta[3] is the 
32250 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
32260 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
32270 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20   so far, so the 
32280 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  new root-page is
32290 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20   (meta[3]+1)..  
322a0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
322b0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
322c0 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f  a(p, 4, &pgnoRoo
322d0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
322e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
322f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32300 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74    }.    pgnoRoot
32310 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
32320 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
32330 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
32340 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
32350 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
32360 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
32370 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
32380 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e  /.    while( pgn
32390 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41  oRoot==PTRMAP_PA
323a0 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f  GENO(pBt, pgnoRo
323b0 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70  ot) ||.        p
323c0 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47  gnoRoot==PENDING
323d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
323e0 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  ){.      pgnoRoo
323f0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t++;.    }.    a
32400 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e  ssert( pgnoRoot>
32410 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  =3 );..    /* Al
32420 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54  locate a page. T
32430 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72  he page that cur
32440 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61  rently resides a
32450 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a  t pgnoRoot will.
32460 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20      ** be moved 
32470 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
32480 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68   page (unless th
32490 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
324a0 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20   happens.    ** 
324b0 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e  to reside at pgn
324c0 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20  oRoot)..    */. 
324d0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
324e0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
324f0 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f  pPageMove, &pgno
32500 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  Move, pgnoRoot, 
32510 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
32520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32530 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32540 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e    }..    if( pgn
32550 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20  oMove!=pgnoRoot 
32560 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f  ){.      /* pgno
32570 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65  Root is the page
32580 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
32590 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ed for the root-
325a0 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  page of.      **
325b0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28   the new table (
325c0 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f  assuming an erro
325d0 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29  r did not occur)
325e0 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20  . But we were.  
325f0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
32600 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65   pgnoMove. If re
32610 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20  quired (i.e. if 
32620 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63  it was not alloc
32630 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ated.      ** by
32640 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66   extending the f
32650 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e  ile), the curren
32660 74 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69  t page at positi
32670 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20  on pgnoMove.    
32680 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
32690 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20  journaled..     
326a0 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79   */.      u8 eTy
326b0 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  pe;.      Pgno i
326c0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  PtrPage;..      
326d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
326e0 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f  eMove);..      /
326f0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
32700 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e  currently at pgn
32710 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76  oRoot to pgnoMov
32720 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
32730 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
32740 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
32750 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
32760 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32780 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32790 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
327a0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
327b0 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65  pgnoRoot, &eType
327c0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
327d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
327e0 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d  TE_OK || eType==
327f0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
32800 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
32810 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
32820 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32830 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
32840 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32850 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
32860 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
32870 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20  ROOTPAGE );.    
32880 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
32890 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
328a0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   );.      rc = r
328b0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
328c0 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69   pRoot, eType, i
328d0 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76  PtrPage, pgnoMov
328e0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c  e, 0);.      rel
328f0 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
32900 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  ..      /* Obtai
32910 6e 20 74 68 65 20 70 61 67 65 20 61 74 20 70 67  n the page at pg
32920 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  noRoot */.      
32930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32940 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
32950 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
32960 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32970 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
32980 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
32990 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
329a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
329b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
329c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
329d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
329e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
329f0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
32a00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32a20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
32a30 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
32a40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
32a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32a60 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f   pRoot = pPageMo
32a70 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20  ve;.    } ..    
32a80 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 6f  /* Update the po
32a90 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65  inter-map and me
32aa0 74 61 2d 64 61 74 61 20 77 69 74 68 20 74 68 65  ta-data with the
32ab0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e   new root-page n
32ac0 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63  umber. */.    rc
32ad0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
32ae0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d  , pgnoRoot, PTRM
32af0 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b  AP_ROOTPAGE, 0);
32b00 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
32b10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32b20 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72  (pRoot);.      r
32b30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
32b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32b50 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
32b60 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b  p, 4, pgnoRoot);
32b70 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
32b80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32b90 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72  (pRoot);.      r
32ba0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
32bb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
32bc0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
32bd0 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
32be0 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
32bf0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
32c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
32c10 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
32c20 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32c30 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e  riteable(pRoot->
32c40 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65  pDbPage) );.  ze
32c50 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c  roPage(pRoot, fl
32c60 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  ags | PTF_LEAF);
32c70 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
32c80 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50  nref(pRoot->pDbP
32c90 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65  age);.  *piTable
32ca0 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74   = (int)pgnoRoot
32cb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
32cc0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
32cd0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
32ce0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
32cf0 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
32d00 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63  flags){.  int rc
32d10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
32d20 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
32d30 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
32d40 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65 61    rc = btreeCrea
32d50 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61 62  teTable(p, piTab
32d60 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73 71  le, flags);.  sq
32d70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
32d80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
32d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
32da0 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
32db0 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  se page and all 
32dc0 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52  its children.  R
32dd0 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67  eturn.** the pag
32de0 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
32df0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
32e00 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
32e10 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
32e20 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
32e30 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61 74  * The BTree that
32e40 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61   contains the ta
32e50 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ble */.  Pgno pg
32e60 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  no,            /
32e70 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
32e80 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74 20   clear */.  int 
32e90 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20 20 20  freePageFlag,   
32ea0 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20    /* Deallocate 
32eb0 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  page if true */.
32ec0 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 0a    int *pnChange.
32ed0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
32ee0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
32ef0 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
32f00 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  ar *pCell;.  int
32f10 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   i;..  assert( s
32f20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
32f30 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
32f40 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65  .  if( pgno>page
32f50 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
32f60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32f70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32f80 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67  T;.  }..  rc = g
32f90 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
32fa0 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  t, pgno, &pPage)
32fb0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
32fc0 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
32fd0 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69  age_out;.  for(i
32fe0 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
32ff0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43  ll; i++){.    pC
33000 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
33010 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66  Page, i);.    if
33020 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
33030 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65  {.      rc = cle
33040 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
33050 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
33060 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65  ll), 1, pnChange
33070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
33080 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
33090 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
330a0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
330b0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
330c0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
330d0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
330e0 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
330f0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
33100 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
33110 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
33120 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
33130 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
33140 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65  8]), 1, pnChange
33150 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33160 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
33170 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 65  sepage_out;.  }e
33180 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67 65  lse if( pnChange
33190 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
331a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
331b0 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20 2b  .    *pnChange +
331c0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
331d0 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61    }.  if( freePa
331e0 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  geFlag ){.    rc
331f0 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
33200 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e);.  }else if( 
33210 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
33220 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
33230 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20  DbPage))==0 ){. 
33240 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
33250 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e, pPage->aData[
33260 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  0] | PTF_LEAF);.
33270 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61    }..cleardataba
33280 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65  sepage_out:.  re
33290 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
332a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
332b0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
332c0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ll information f
332d0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62  rom a single tab
332e0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
332f0 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a  se.  iTable is.*
33300 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
33310 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66  r of the root of
33320 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74   the table.  Aft
33330 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
33340 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20  returns,.** the 
33350 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
33360 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78  ty, but still ex
33370 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ists..**.** This
33380 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
33390 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
333a0 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
333b0 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72  re any open.** r
333c0 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
333d0 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20  he table.  Open 
333e0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
333f0 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
33400 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  * root of the ta
33410 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e  ble..**.** If pn
33420 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e 55  Change is not NU
33430 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 69  LL, then table i
33440 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6e  Table must be an
33450 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20 54   intkey table. T
33460 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61  he.** integer va
33470 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lue pointed to b
33480 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69 6e  y pnChange is in
33490 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  cremented by the
334a0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6e   number of.** en
334b0 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61 62  tries in the tab
334c0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
334d0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
334e0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
334f0 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e 43  iTable, int *pnC
33500 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  hange){.  int rc
33510 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
33520 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
33530 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
33540 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
33550 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
33560 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
33570 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
33580 28 20 28 72 63 20 3d 20 63 68 65 63 6b 52 65 61  ( (rc = checkRea
33590 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65  dLocks(p, iTable
335a0 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  , 0, 1))!=SQLITE
335b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  _OK ){.    /* no
335c0 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
335d0 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
335e0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
335f0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
33600 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20  iTable, 0)) ){. 
33610 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
33620 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a   do */.  }else{.
33630 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
33640 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
33650 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c  (Pgno)iTable, 0,
33660 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a   pnChange);.  }.
33670 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
33680 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
33690 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
336a0 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ase all informat
336b0 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61  ion in a table a
336c0 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20  nd add the root 
336d0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a  of the table to.
336e0 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
336f0 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f    Except, the ro
33700 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69  ot of the princi
33710 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f  ple table (the o
33720 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29  ne on.** page 1)
33730 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
33740 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
33750 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
33760 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
33770 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
33780 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
33790 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  y open.** cursor
337a0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
337b0 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
337c0 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61  UUM is enabled a
337d0 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69  nd the page at i
337e0 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65  Table is not the
337f0 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61   last.** root pa
33800 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
33810 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
33820 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
33830 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61   .** in the data
33840 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76  base file is mov
33850 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74  ed into the slot
33860 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
33870 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20  ed by.** iTable 
33880 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c  and that last sl
33890 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
338a0 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74  pied by the last
338b0 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
338c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
338d0 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f  eelist instead o
338e0 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68  f iTable.  In th
338f0 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72  is say, all.** r
33900 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65  oot pages are ke
33910 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  pt at the beginn
33920 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
33930 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a  ase file, which.
33940 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ** is necessary 
33950 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74  for AUTOVACUUM t
33960 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a  o work right.  *
33970 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
33980 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e  o the .** page n
33990 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20  umber that used 
339a0 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72  to be the last r
339b0 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
339c0 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  file before.** t
339d0 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20  he move.  If no 
339e0 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c  page gets moved,
339f0 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
33a00 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61   to 0..** The la
33a10 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  st root page is 
33a20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61  recorded in meta
33a30 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75  [3] and the valu
33a40 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20  e of.** meta[3] 
33a50 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
33a60 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f  is procedure..*/
33a70 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
33a80 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
33a90 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
33aa0 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
33ab0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
33ac0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
33ad0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
33ae0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
33af0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
33b00 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
33b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
33b20 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
33b30 52 49 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 74  RITE );..  /* It
33b40 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64   is illegal to d
33b50 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61  rop a table if a
33b60 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f  ny cursors are o
33b70 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  pen on the.  ** 
33b80 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
33b90 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74  s because in aut
33ba0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68  o-vacuum mode th
33bb0 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20  e backend may.  
33bc0 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  ** need to move 
33bd0 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67  another root-pag
33be0 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20  e to fill a gap 
33bf0 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
33c00 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61  ted.  ** root pa
33c10 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63  ge. If an open c
33c20 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
33c30 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62  this page a prob
33c40 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20  lem would .  ** 
33c50 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  occur..  */.  if
33c60 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
33c70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33c80 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a  ITE_LOCKED;.  }.
33c90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
33ca0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
33cb0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
33cc0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
33cd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
33ce0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
33cf0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
33d00 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
33d10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
33d20 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
33d30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
33d40 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64  .  }..  *piMoved
33d50 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61   = 0;..  if( iTa
33d60 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20  ble>1 ){.#ifdef 
33d70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
33d80 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20  VACUUM.    rc = 
33d90 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
33da0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
33db0 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20  (pPage);.#else. 
33dc0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33dd0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
33de0 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  Pgno maxRootPgno
33df0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
33e00 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
33e10 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50  (p, 4, &maxRootP
33e20 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
33e30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33e40 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
33e50 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
33e60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33e70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
33e80 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f  f( iTable==maxRo
33e90 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  otPgno ){.      
33ea0 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
33eb0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
33ec0 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  is the table wit
33ed0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  h the largest ro
33ee0 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
33ef0 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ** number in the
33f00 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74   database, put t
33f10 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20  he root page on 
33f20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a  the free list. .
33f30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33f40 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
33f50 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
33f60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
33f70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
33f80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33f90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
33fa0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
33fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33fc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
33fd0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
33fe0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
33ff0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
34000 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
34010 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61  number in the da
34020 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20  tabase. So move 
34030 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f  the page that do
34040 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  es into the .   
34050 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74       ** gap left
34060 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20   by the deleted 
34070 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20  root-page..     
34080 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65     */.        Me
34090 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20  mPage *pMove;.  
340a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
340b0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
340c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
340d0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
340e0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
340f0 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
34100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34110 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
34120 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
34130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
34140 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
34150 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41  Bt, pMove, PTRMA
34160 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69  P_ROOTPAGE, 0, i
34170 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
34180 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34190 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
341a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
341b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
341c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
341d0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
341e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
341f0 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
34200 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29  Pgno, &pMove, 0)
34210 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34230 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
34240 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
34250 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
34260 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
34270 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34280 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
34290 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
342a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
342b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
342c0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d    }.        *piM
342d0 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67  oved = maxRootPg
342e0 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
342f0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65     /* Set the ne
34300 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65  w 'max-root-page
34310 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64  ' value in the d
34320 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20  atabase header. 
34330 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73  This.      ** is
34340 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c   the old value l
34350 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e  ess one, less on
34360 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68  e more if that h
34370 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20  appens to.      
34380 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67  ** be a root-pag
34390 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f  e number, less o
343a0 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74  ne again if that
343b0 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
343c0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
343d0 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  GE..      */.   
343e0 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
343f0 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  ;.      if( maxR
34400 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47  ootPgno==PENDING
34410 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
34420 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
34430 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
34440 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  }.      if( maxR
34450 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f  ootPgno==PTRMAP_
34460 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52  PAGENO(pBt, maxR
34470 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20  ootPgno) ){.    
34480 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
34490 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
344a0 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74   assert( maxRoot
344b0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
344c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
344d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
344e0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
344f0 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74  ta(p, 4, maxRoot
34500 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Pgno);.    }else
34510 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
34520 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
34530 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34540 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  pPage);.    }.#e
34550 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
34560 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42    /* If sqlite3B
34570 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61  treeDropTable wa
34580 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  s called on page
34590 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50   1. */.    zeroP
345a0 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49  age(pPage, PTF_I
345b0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29  NTKEY|PTF_LEAF )
345c0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
345d0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
345e0 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69  return rc;  .}.i
345f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
34600 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
34610 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
34620 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
34630 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
34640 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
34650 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70    p->pBt->db = p
34660 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72  ->db;.  rc = btr
34670 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69  eeDropTable(p, i
34680 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b  Table, piMoved);
34690 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
346a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
346b0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
346c0 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
346d0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
346e0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
346f0 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
34700 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
34710 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
34720 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
34730 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
34740 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
34750 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
34760 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
34770 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
34780 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
34790 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
347a0 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
347b0 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
347c0 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
347d0 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
347e0 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
347f0 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
34800 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
34810 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
34820 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
34830 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
34840 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
34850 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
34860 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
34870 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
34880 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
34890 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
348a0 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a  , int idx, u32 *
348b0 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65  pMeta){.  DbPage
348c0 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20   *pDbPage = 0;. 
348d0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
348e0 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
348f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
34900 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
34910 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
34920 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
34930 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69  >db;..  /* Readi
34940 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76  ng a meta-data v
34950 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61 20  alue requires a 
34960 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
34970 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20  e 1 (and hence. 
34980 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   ** the sqlite_m
34990 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20  aster table. We 
349a0 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72  grab this lock r
349b0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
349c0 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74  ther or.  ** not
349d0 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64   the SQLITE_Read
349e0 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
349f0 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61 62   is set (the tab
34a00 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
34a10 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61  e.  ** 1 is trea
34a20 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c  ted as a special
34a30 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54 61   case by queryTa
34a40 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f  bleLock() and lo
34a50 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f  ckTable())..  */
34a60 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62  .  rc = queryTab
34a70 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41  leLock(p, 1, REA
34a80 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  D_LOCK);.  if( r
34a90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34aa0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
34ab0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
34ac0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
34ad0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
34ae0 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69  & idx<=15 );.  i
34af0 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  f( pBt->pPage1 )
34b00 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74  {.    /* The b-t
34b10 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 68  ree is already h
34b20 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
34b30 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f 66 20  ce to page 1 of 
34b40 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
34b50 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69   ** file. In thi
34b60 73 20 63 61 73 65 20 74 68 65 20 72 65 71 75 69  s case the requi
34b70 72 65 64 20 6d 65 74 61 2d 64 61 74 61 20 76 61  red meta-data va
34b80 6c 75 65 20 63 61 6e 20 62 65 20 72 65 61 64 20  lue can be read 
34b90 64 69 72 65 63 74 6c 79 0a 20 20 20 20 2a 2a 20  directly.    ** 
34ba0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 64 61  from the page da
34bb0 74 61 20 6f 66 20 74 68 69 73 20 72 65 66 65 72  ta of this refer
34bc0 65 6e 63 65 2e 20 54 68 69 73 20 69 73 20 73 6c  ence. This is sl
34bd0 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68  ightly faster th
34be0 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  an.    ** reques
34bf0 74 69 6e 67 20 61 20 6e 65 77 20 72 65 66 65 72  ting a new refer
34c00 65 6e 63 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ence from the pa
34c10 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a  ger layer..    *
34c20 2f 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73  /.    pP1 = (uns
34c30 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 42 74  igned char *)pBt
34c40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  ->pPage1->aData;
34c50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
34c60 20 54 68 65 20 62 2d 74 72 65 65 20 64 6f 65 73   The b-tree does
34c70 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 66 65   not have a refe
34c80 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
34c90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
34ca0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 4f 62 74  file..    ** Obt
34cb0 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ain one from the
34cc0 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20   pager layer..  
34cd0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
34ce0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
34cf0 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70  t->pPager, 1, &p
34d00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
34d10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   rc ){.      sql
34d20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
34d30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
34d40 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
34d50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
34d60 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
34d70 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
34d80 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65 74 61 20  );.  }.  *pMeta 
34d90 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b  = get4byte(&pP1[
34da0 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 0a 20  36 + idx*4]);.. 
34db0 20 2f 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65   /* If the b-tre
34dc0 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67  e is not holding
34dd0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
34de0 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6f 6e 65  page 1, then one
34df0 20 77 61 73 20 0a 20 20 2a 2a 20 72 65 71 75 65   was .  ** reque
34e00 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  sted from the pa
34e10 67 65 72 20 6c 61 79 65 72 20 69 6e 20 74 68 65  ger layer in the
34e20 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20 52 65   above block. Re
34e30 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
34e40 2a 2f 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  */.  if( !pBt->p
34e50 50 61 67 65 31 20 29 7b 0a 20 20 20 20 73 71 6c  Page1 ){.    sql
34e60 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
34e70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  DbPage);.  }..  
34e80 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d  /* If autovacuum
34e90 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ed is disabled i
34ea0 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74  n this build but
34eb0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
34ec0 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61  o .  ** access a
34ed0 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64  n autovacuumed d
34ee0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61  atabase, then ma
34ef0 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ke the database 
34f00 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a  readonly. .  */.
34f10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
34f20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
34f30 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70  if( idx==4 && *p
34f40 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65  Meta>0 ) pBt->re
34f50 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64  adOnly = 1;.#end
34f60 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  if..  /* Grab th
34f70 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  e read-lock on p
34f80 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d  age 1. */.  rc =
34f90 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c   lockTable(p, 1,
34fa0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73   READ_LOCK);.  s
34fb0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34fc0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
34fd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
34fe0 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
34ff0 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
35000 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
35010 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e  0] is.** read-on
35020 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62  ly and may not b
35030 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e  e written..*/.in
35040 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  t sqlite3BtreeUp
35050 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a  dateMeta(Btree *
35060 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
35070 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72  iMeta){.  BtShar
35080 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
35090 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
350a0 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63  r *pP1;.  int rc
350b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ;.  assert( idx>
350c0 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =1 && idx<=15 );
350d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
350e0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
350f0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
35100 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
35110 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
35120 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
35130 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70  pPage1!=0 );.  p
35140 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
35150 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
35160 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35170 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
35180 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
35190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
351a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
351b0 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69  1[36 + idx*4], i
351c0 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  Meta);.#ifndef S
351d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
351e0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 69 64  ACUUM.    if( id
351f0 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  x==7 ){.      as
35200 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
35210 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d  acuum || iMeta==
35220 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
35230 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69  t( iMeta==0 || i
35240 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Meta==1 );.     
35250 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
35260 20 3d 20 28 75 38 29 69 4d 65 74 61 3b 0a 20 20   = (u8)iMeta;.  
35270 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
35280 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
35290 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
352a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
352b0 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74  urn the flag byt
352c0 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  e at the beginni
352d0 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ng of the page t
352e0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
352f0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  * is currently p
35300 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69  ointing to..*/.i
35310 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
35320 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70  lags(BtCursor *p
35330 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
35340 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53   What about CURS
35350 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73  OR_REQUIRESEEK s
35360 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e  tate? Probably n
35370 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  eed to call.  **
35380 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
35390 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20  sition() here.. 
353a0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
353b0 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43  Page;.  restoreC
353c0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
353d0 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ur);.  pPage = p
353e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
353f0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
35400 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
35410 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
35420 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30  assert( pPage!=0
35430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35440 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e  age->pBt==pCur->
35450 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  pBt );.  return 
35460 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
35470 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 3b 0a  ge->hdrOffset];.
35480 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
35490 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
354a0 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
354b0 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
354c0 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
354d0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
354e0 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
354f0 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
35500 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
35510 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
35520 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
35530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35540 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
35550 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  ECK./*.** Append
35560 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68   a message to th
35570 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
35580 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
35590 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65  c void checkAppe
355a0 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69  ndMsg(.  Integri
355b0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  tyCk *pCheck,.  
355c0 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63  char *zMsg1,.  c
355d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
355e0 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
355f0 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
35600 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
35610 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
35620 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
35630 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
35640 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
35650 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43  ormat);.  if( pC
35660 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68  heck->errMsg.nCh
35670 61 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ar ){.    sqlite
35680 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
35690 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
356a0 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20   "\n", 1);.  }. 
356b0 20 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20   if( zMsg1 ){.  
356c0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
356d0 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
356e0 3e 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20  >errMsg, zMsg1, 
356f0 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  -1);.  }.  sqlit
35700 65 33 56 58 50 72 69 6e 74 66 28 26 70 43 68 65  e3VXPrintf(&pChe
35710 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a  ck->errMsg, 1, z
35720 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
35730 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
35740 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e   pCheck->errMsg.
35750 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
35760 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c      pCheck->mall
35770 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
35780 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
35790 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
357a0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
357b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
357c0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
357d0 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
357e0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
357f0 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
35800 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
35810 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
35820 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
35830 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
35840 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
35850 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
35860 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
35870 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
35880 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
35890 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
358a0 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
358b0 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
358c0 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
358d0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
358e0 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
358f0 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
35900 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
35910 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
35920 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
35930 2c 20 50 67 6e 6f 20 69 50 61 67 65 2c 20 63 68  , Pgno iPage, ch
35940 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20  ar *zContext){. 
35950 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20   if( iPage==0 ) 
35960 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
35970 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50  iPage>pCheck->nP
35980 61 67 65 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  age ){.    check
35990 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
359a0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76  , zContext, "inv
359b0 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
359c0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
359d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
359e0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e    if( pCheck->an
359f0 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b  Ref[iPage]==1 ){
35a00 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
35a10 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
35a20 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72  text, "2nd refer
35a30 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22  ence to page %d"
35a40 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
35a50 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
35a60 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61  turn  (pCheck->a
35a70 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31  nRef[iPage]++)>1
35a80 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
35a90 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
35aa0 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  UUM./*.** Check 
35ab0 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69  that the entry i
35ac0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
35ad0 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c  p for page iChil
35ae0 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61  d maps to .** pa
35af0 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e  ge iParent, poin
35b00 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65  ter type ptrType
35b10 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64  . If not, append
35b20 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
35b30 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a  e.** to pCheck..
35b40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
35b50 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e  heckPtrmap(.  In
35b60 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
35b70 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  k,   /* Integrit
35b80 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20  y check context 
35b90 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
35ba0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
35bb0 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72  hild page number
35bc0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
35bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35be0 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
35bf0 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50   map type */.  P
35c00 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20  gno iParent,    
35c10 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
35c20 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  d pointer map pa
35c30 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
35c40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
35c50 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20  text         /* 
35c60 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74  Context descript
35c70 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72  ion (used for er
35c80 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20  ror msg) */.){. 
35c90 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50   int rc;.  u8 eP
35ca0 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e  trmapType;.  Pgn
35cb0 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b  o iPtrmapParent;
35cc0 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47  ..  rc = ptrmapG
35cd0 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20  et(pCheck->pBt, 
35ce0 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70  iChild, &ePtrmap
35cf0 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61  Type, &iPtrmapPa
35d00 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
35d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35d20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35d30 5f 4e 4f 4d 45 4d 20 29 20 70 43 68 65 63 6b 2d  _NOMEM ) pCheck-
35d40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
35d50 31 3b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  1;.    checkAppe
35d60 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
35d70 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20  ontext, "Failed 
35d80 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b  to read ptrmap k
35d90 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b  ey=%d", iChild);
35da0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
35db0 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54  ..  if( ePtrmapT
35dc0 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50  ype!=eType || iP
35dd0 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61  trmapParent!=iPa
35de0 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63  rent ){.    chec
35df0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
35e00 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20  k, zContext, .  
35e10 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70      "Bad ptr map
35e20 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78   entry key=%d ex
35e30 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67  pected=(%d,%d) g
35e40 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20  ot=(%d,%d)", .  
35e50 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70      iChild, eTyp
35e60 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72  e, iParent, ePtr
35e70 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70  mapType, iPtrmap
35e80 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23  Parent);.  }.}.#
35e90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
35ea0 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
35eb0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
35ec0 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c   or of an overfl
35ed0 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a  ow page list..**
35ee0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
35ef0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
35f00 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20   on the list is 
35f10 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  N..*/.static voi
35f20 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49  d checkList(.  I
35f30 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
35f40 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  ck,  /* Integrit
35f50 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65  y checking conte
35f60 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72  xt */.  int isFr
35f70 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  eeList,       /*
35f80 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65   True for a free
35f90 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72  list.  False for
35fa0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c   overflow page l
35fb0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ist */.  int iPa
35fc0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
35fd0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
35fe0 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  r first page in 
35ff0 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  the list */.  in
36000 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
36010 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
36020 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
36030 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
36040 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
36050 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
36060 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  t for error mess
36070 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ages */.){.  int
36080 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74   i;.  int expect
36090 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46  ed = N;.  int iF
360a0 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20  irst = iPage;.  
360b0 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26  while( N-- > 0 &
360c0 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20  & pCheck->mxErr 
360d0 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70  ){.    DbPage *p
360e0 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e  OvflPage;.    un
360f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76  signed char *pOv
36100 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  flData;.    if( 
36110 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20  iPage<1 ){.     
36120 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
36130 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
36140 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64 20 6f  ,.         "%d o
36150 66 20 25 64 20 70 61 67 65 73 20 6d 69 73 73 69  f %d pages missi
36160 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77  ng from overflow
36170 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
36180 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t %d",.         
36190 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20   N+1, expected, 
361a0 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62  iFirst);.      b
361b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
361c0 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68  if( checkRef(pCh
361d0 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  eck, iPage, zCon
361e0 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  text) ) break;. 
361f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
36200 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  gerGet(pCheck->p
36210 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61  Pager, (Pgno)iPa
36220 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20  ge, &pOvflPage) 
36230 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
36240 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
36250 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65  zContext, "faile
36260 64 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64  d to get page %d
36270 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ", iPage);.     
36280 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
36290 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75    pOvflData = (u
362a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
362b0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
362c0 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20  ta(pOvflPage);. 
362d0 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69 73     if( isFreeLis
362e0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
362f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76   = get4byte(&pOv
36300 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e  flData[4]);.#ifn
36310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36320 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
36330 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
36340 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
36350 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
36360 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67  map(pCheck, iPag
36370 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
36380 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29  GE, 0, zContext)
36390 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
363a0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68  .      if( n>pCh
363b0 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  eck->pBt->usable
363c0 53 69 7a 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20  Size/4-2 ){.    
363d0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
363e0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
363f0 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
36400 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63  "freelist leaf c
36410 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20  ount too big on 
36420 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
36430 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20  ;.        N--;. 
36440 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36450 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
36460 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
36470 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
36480 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76   = get4byte(&pOv
36490 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  flData[8+i*4]);.
364a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
364b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
364c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68           if( pCh
364d0 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
364e0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
364f0 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
36500 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67  pCheck, iFreePag
36510 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
36520 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29  GE, 0, zContext)
36530 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
36540 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63  ndif.          c
36550 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
36560 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74  iFreePage, zCont
36570 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ext);.        }.
36580 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a          N -= n;.
36590 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
365a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
365b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
365c0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
365d0 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
365e0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
365f0 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20  acuum and iPage 
36600 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
36610 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
36620 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c   this overflow l
36630 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ist, check that 
36640 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
36650 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20  entry for.      
36660 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
36670 20 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50   page matches iP
36680 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  age..      */.  
36690 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
366a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
366b0 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20  && N>0 ){.      
366c0 20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70    i = get4byte(p
366d0 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20  OvflData);.     
366e0 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
366f0 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50  Check, i, PTRMAP
36700 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67  _OVERFLOW2, iPag
36710 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
36720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
36730 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67  if.    iPage = g
36740 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74  et4byte(pOvflDat
36750 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  a);.    sqlite3P
36760 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50  agerUnref(pOvflP
36770 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  age);.  }.}.#end
36780 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
36790 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
367a0 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
367b0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
367c0 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
367d0 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74  Do various sanit
367e0 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69  y checks on a si
367f0 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74  ngle page of a t
36800 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ree.  Return.** 
36810 74 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20  the tree depth. 
36820 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75   Root pages retu
36830 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f  rn 0.  Parents o
36840 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20  f root pages.** 
36850 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f  return 1, and so
36860 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54   forth..** .** T
36870 68 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20  hese checks are 
36880 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  done:.**.**     
36890 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   1.  Make sure t
368a0 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72  hat cells and fr
368b0 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20  eeblocks do not 
368c0 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20  overlap.**      
368d0 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20      but combine 
368e0 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f  to completely co
368f0 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ver the page..**
36900 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73    NO  2.  Make s
36910 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72  ure cell keys ar
36920 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20  e in order..**  
36930 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72  NO  3.  Make sur
36940 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73  e no key is less
36950 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
36960 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a  o zLowerBound..*
36970 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20  *  NO  4.  Make 
36980 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67  sure no key is g
36990 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
369a0 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f  qual to zUpperBo
369b0 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20  und..**      5. 
369c0 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
369d0 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77  rity of overflow
369e0 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20   pages..**      
369f0 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20  6.  Recursively 
36a00 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61  call checkTreePa
36a10 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72  ge on all childr
36a20 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20  en..**      7.  
36a30 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
36a40 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69  depth of all chi
36a50 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d  ldren is the sam
36a60 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d  e..**      8.  M
36a70 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61  ake sure this pa
36a80 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33  ge is at least 3
36a90 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20  3% full or else 
36aa0 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  it is.**        
36ab0 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68    the root of th
36ac0 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  e tree..*/.stati
36ad0 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50  c int checkTreeP
36ae0 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79  age(.  Integrity
36af0 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20  Ck *pCheck,  /* 
36b00 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  Context for the 
36b10 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a  sanity check */.
36b20 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
36b30 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36b40 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
36b50 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  ge to check */. 
36b60 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
36b70 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74  ntext  /* Parent
36b80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
36b90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
36ba0 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65  .  int i, rc, de
36bb0 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63  pth, d2, pgno, c
36bc0 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63  nt;.  int hdr, c
36bd0 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20  ellStart;.  int 
36be0 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74  nCell;.  u8 *dat
36bf0 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
36c00 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  Bt;.  int usable
36c10 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f  Size;.  char zCo
36c20 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68  ntext[100];.  ch
36c30 61 72 20 2a 68 69 74 20 3d 20 30 3b 0a 0a 20 20  ar *hit = 0;..  
36c40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
36c50 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
36c60 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61  ), zContext, "Pa
36c70 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29  ge %d: ", iPage)
36c80 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
36c90 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73  at the page exis
36ca0 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20  ts.  */.  pBt = 
36cb0 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75  pCheck->pBt;.  u
36cc0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
36cd0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
36ce0 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
36cf0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68  turn 0;.  if( ch
36d00 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
36d10 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e  Page, zParentCon
36d20 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30  text) ) return 0
36d30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  ;.  if( (rc = sq
36d40 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
36d50 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61  e(pBt, (Pgno)iPa
36d60 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
36d70 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  =0 ){.    if( rc
36d80 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
36d90 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46   pCheck->mallocF
36da0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 63  ailed = 1;.    c
36db0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
36dc0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
36dd0 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
36de0 6f 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20  o get the page. 
36df0 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20  error code=%d", 
36e00 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
36e10 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63  0;.  }.  if( (rc
36e20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
36e30 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 29 21  nitPage(pPage))!
36e40 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
36e50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
36e60 52 55 50 54 20 29 3b 20 20 2f 2a 20 54 68 65 20  RUPT );  /* The 
36e70 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 65 72  only possible er
36e80 72 6f 72 20 66 72 6f 6d 20 49 6e 69 74 50 61 67  ror from InitPag
36e90 65 20 2a 2f 0a 20 20 20 20 63 68 65 63 6b 41 70  e */.    checkAp
36ea0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
36eb0 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
36ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73                "s
36ed0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
36ee0 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72  age() returns er
36ef0 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63  ror code %d", rc
36f00 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
36f10 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
36f20 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
36f30 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c  /* Check out all
36f40 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   the cells..  */
36f50 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20  .  depth = 0;.  
36f60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
36f70 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63  ->nCell && pChec
36f80 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  k->mxErr; i++){.
36f90 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
36fa0 20 20 20 75 33 32 20 73 7a 3b 0a 20 20 20 20 43     u32 sz;.    C
36fb0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
36fc0 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c     /* Check payl
36fd0 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  oad overflow pag
36fe0 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  es.    */.    sq
36ff0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
37000 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c  izeof(zContext),
37010 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
37020 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65          "On tree
37030 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
37040 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
37050 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
37060 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
37070 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
37080 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
37090 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
370a0 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
370b0 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21  nData;.    if( !
370c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20  pPage->intKey ) 
370d0 73 7a 20 2b 3d 20 28 69 6e 74 29 69 6e 66 6f 2e  sz += (int)info.
370e0 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74  nKey;.    assert
370f0 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ( sz==info.nPayl
37100 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73  oad );.    if( s
37110 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  z>info.nLocal ){
37120 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
37130 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c   = (sz - info.nL
37140 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a  ocal + usableSiz
37150 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69  e - 5)/(usableSi
37160 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50  ze - 4);.      P
37170 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
37180 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
37190 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
371a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
371b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
371c0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
371d0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
371e0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
371f0 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66  (pCheck, pgnoOvf
37200 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
37210 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  OW1, iPage, zCon
37220 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
37230 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63  endif.      chec
37240 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c  kList(pCheck, 0,
37250 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65   pgnoOvfl, nPage
37260 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
37270 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
37280 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20   sanity of left 
37290 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20  child page..    
372a0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
372b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
372c0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
372d0 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  (pCell);.#ifndef
372e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
372f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
37300 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
37310 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
37320 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
37330 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
37340 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  REE, iPage, zCon
37350 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
37360 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d  endif.      d2 =
37370 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70   checkTreePage(p
37380 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 7a 43 6f  Check, pgno, zCo
37390 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  ntext);.      if
373a0 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70  ( i>0 && d2!=dep
373b0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  th ){.        ch
373c0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
373d0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
373e0 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68  Child page depth
373f0 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20   differs");.    
37400 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20    }.      depth 
37410 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = d2;.    }.  }.
37420 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
37430 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
37440 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
37450 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
37460 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
37470 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
37480 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65  tf(sizeof(zConte
37490 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  xt), zContext, .
374a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374b0 20 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64       "On page %d
374c0 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a   at right child:
374d0 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e   ", iPage);.#ifn
374e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
374f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
37500 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
37510 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  um ){.      chec
37520 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
37530 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
37540 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20  EE, iPage, 0);. 
37550 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
37560 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
37570 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 7a 43 6f 6e  heck, pgno, zCon
37580 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f  text);.  }. .  /
37590 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70  * Check for comp
375a0 6c 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66  lete coverage of
375b0 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20   the page.  */. 
375c0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
375d0 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
375e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
375f0 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50    hit = sqlite3P
37600 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
37610 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  pageSize );.  if
37620 28 20 68 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( hit==0 ){.    
37630 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61  pCheck->mallocFa
37640 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  iled = 1;.  }els
37650 65 7b 0a 20 20 20 20 75 31 36 20 63 6f 6e 74 65  e{.    u16 conte
37660 6e 74 4f 66 66 73 65 74 20 3d 20 67 65 74 32 62  ntOffset = get2b
37670 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
37680 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 6e 74 65  );.    if (conte
37690 6e 74 4f 66 66 73 65 74 20 3e 20 75 73 61 62 6c  ntOffset > usabl
376a0 65 53 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 63  eSize) {.      c
376b0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
376c0 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
376d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
376e0 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
376f0 74 65 64 20 69 6e 20 68 65 61 64 65 72 20 6f 6e  ted in header on
37700 20 70 61 67 65 20 25 64 22 2c 69 50 61 67 65 2c   page %d",iPage,
37710 30 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63  0);.      goto c
37720 68 65 63 6b 5f 70 61 67 65 5f 61 62 6f 72 74 3b  heck_page_abort;
37730 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
37740 74 28 68 69 74 2b 63 6f 6e 74 65 6e 74 4f 66 66  t(hit+contentOff
37750 73 65 74 2c 20 30 2c 20 75 73 61 62 6c 65 53 69  set, 0, usableSi
37760 7a 65 2d 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74  ze-contentOffset
37770 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69  );.    memset(hi
37780 74 2c 20 31 2c 20 63 6f 6e 74 65 6e 74 4f 66 66  t, 1, contentOff
37790 73 65 74 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  set);.    nCell 
377a0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
377b0 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65  [hdr+3]);.    ce
377c0 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20  llStart = hdr + 
377d0 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
377e0 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  af;.    for(i=0;
377f0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
37800 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67        int pc = g
37810 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
37820 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20  llStart+i*2]);. 
37830 20 20 20 20 20 75 31 36 20 73 69 7a 65 20 3d 20       u16 size = 
37840 31 30 32 34 3b 0a 20 20 20 20 20 20 69 6e 74 20  1024;.      int 
37850 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  j;.      if( pc<
37860 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  =usableSize ){. 
37870 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20 63 65         size = ce
37880 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
37890 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
378a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
378b0 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62  pc+size-1)>=usab
378c0 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29  leSize || pc<0 )
378d0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
378e0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
378f0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
37900 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74   "Corruption det
37910 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64  ected in cell %d
37920 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69   on page %d",i,i
37930 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d  Page,0);.      }
37940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
37950 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a  r(j=pc+size-1; j
37960 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a  >=pc; j--) hit[j
37970 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]++;.      }.   
37980 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30   }.    for(cnt=0
37990 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26 64 61  , i=get2byte(&da
379a0 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20  ta[hdr+1]); i>0 
379b0 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20  && i<usableSize 
379c0 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20  && cnt<10000; . 
379d0 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29            cnt++)
379e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
379f0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
37a00 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  a[i+2]);.      i
37a10 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
37a20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62  (i+size-1)>=usab
37a30 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b  leSize || i<0 ){
37a40 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
37a50 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
37a60 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  0,  .           
37a70 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74   "Corruption det
37a80 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64  ected in cell %d
37a90 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69   on page %d",i,i
37aa0 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d  Page,0);.      }
37ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
37ac0 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e  r(j=i+size-1; j>
37ad0 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  =i; j--) hit[j]+
37ae0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
37af0 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   i = get2byte(&d
37b00 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ata[i]);.    }. 
37b10 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20     for(i=cnt=0; 
37b20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b  i<usableSize; i+
37b30 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69  +){.      if( hi
37b40 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t[i]==0 ){.     
37b50 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
37b60 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d  }else if( hit[i]
37b70 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  >1 ){.        ch
37b80 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
37b90 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  eck, 0,.        
37ba0 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73    "Multiple uses
37bb0 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20   for byte %d of 
37bc0 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61  page %d", i, iPa
37bd0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
37be0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
37bf0 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64  }.    if( cnt!=d
37c00 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20  ata[hdr+7] ){.  
37c10 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
37c20 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
37c30 20 20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65           "Fragme
37c40 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 25 64  nted space is %d
37c50 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20 61   byte reported a
37c60 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22  s %d on page %d"
37c70 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c  ,.          cnt,
37c80 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50   data[hdr+7], iP
37c90 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
37ca0 63 68 65 63 6b 5f 70 61 67 65 5f 61 62 6f 72 74  check_page_abort
37cb0 3a 0a 20 20 69 66 20 28 68 69 74 29 20 73 71 6c  :.  if (hit) sql
37cc0 69 74 65 33 50 61 67 65 46 72 65 65 28 68 69 74  ite3PageFree(hit
37cd0 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  );..  releasePag
37ce0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
37cf0 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65  rn depth+1;.}.#e
37d00 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
37d10 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
37d20 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
37d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
37d40 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
37d50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
37d60 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63  oes a complete c
37d70 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65  heck of the give
37d80 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61  n BTree file.  a
37d90 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20  Root[] is.** an 
37da0 61 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e  array of pages n
37db0 75 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68  umbers were each
37dc0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
37dd0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
37de0 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52  .** a table.  nR
37df0 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  oot is the numbe
37e00 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
37e10 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  aRoot..**.** Wri
37e20 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
37e30 20 65 72 72 6f 72 20 73 65 65 6e 20 69 6e 20 2a   error seen in *
37e40 70 6e 45 72 72 2e 20 20 45 78 63 65 70 74 20 66  pnErr.  Except f
37e50 6f 72 20 73 6f 6d 65 20 6d 65 6d 6f 72 79 0a 2a  or some memory.*
37e60 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  * allocation err
37e70 6f 72 73 2c 20 20 61 6e 20 65 72 72 6f 72 20 6d  ors,  an error m
37e80 65 73 73 61 67 65 20 68 65 6c 64 20 69 6e 20 6d  essage held in m
37e90 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
37ea0 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 69 73  rom.** malloc is
37eb0 20 72 65 74 75 72 6e 65 64 20 69 66 20 2a 70 6e   returned if *pn
37ec0 45 72 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  Err is non-zero.
37ed0 20 20 49 66 20 2a 70 6e 45 72 72 3d 3d 30 20 74    If *pnErr==0 t
37ee0 68 65 6e 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 72  hen NULL is.** r
37ef0 65 74 75 72 6e 65 64 2e 20 20 49 66 20 61 20 6d  eturned.  If a m
37f00 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
37f10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
37f20 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
37f30 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
37f40 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
37f50 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70  heck(.  Btree *p
37f60 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72  ,     /* The btr
37f70 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  ee to be checked
37f80 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
37f90 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20  ,   /* An array 
37fa0 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  of root pages nu
37fb0 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69  mbers for indivi
37fc0 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20  dual trees */.  
37fd0 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a  int nRoot,    /*
37fe0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
37ff0 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f  es in aRoot[] */
38000 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20  .  int mxErr,   
38010 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69   /* Stop reporti
38020 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20  ng errors after 
38030 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69  this many */.  i
38040 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20  nt *pnErr    /* 
38050 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  Write number of 
38060 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74  errors seen to t
38070 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  his variable */.
38080 29 7b 0a 20 20 50 67 6e 6f 20 69 3b 0a 20 20 69  ){.  Pgno i;.  i
38090 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67  nt nRef;.  Integ
380a0 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20  rityCk sCheck;. 
380b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
380c0 20 70 2d 3e 70 42 74 3b 0a 20 20 63 68 61 72 20   p->pBt;.  char 
380d0 7a 45 72 72 5b 31 30 30 5d 3b 0a 0a 20 20 73 71  zErr[100];..  sq
380e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
380f0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
38100 70 2d 3e 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20  p->db;.  nRef = 
38110 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
38120 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
38130 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72  );.  if( lockBtr
38140 65 65 57 69 74 68 52 65 74 72 79 28 70 29 21 3d  eeWithRetry(p)!=
38150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38160 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20   *pnErr = 1;.   
38170 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
38180 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
38190 6e 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  n sqlite3DbStrDu
381a0 70 28 30 2c 20 22 63 61 6e 6e 6f 74 20 61 63 71  p(0, "cannot acq
381b0 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
381c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
381d0 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
381e0 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
381f0 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
38200 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
38210 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 61 67 65  eck.nPage = page
38220 72 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63  rPagecount(sChec
38230 6b 2e 70 42 74 29 3b 0a 20 20 73 43 68 65 63 6b  k.pBt);.  sCheck
38240 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a  .mxErr = mxErr;.
38250 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20    sCheck.nErr = 
38260 30 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 61 6c 6c  0;.  sCheck.mall
38270 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
38280 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66  *pnErr = 0;.  if
38290 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d  ( sCheck.nPage==
382a0 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  0 ){.    unlockB
382b0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
382c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
382d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
382e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
382f0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20   sCheck.anRef = 
38300 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28  sqlite3Malloc( (
38310 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a  sCheck.nPage+1)*
38320 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e  sizeof(sCheck.an
38330 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  Ref[0]) );.  if(
38340 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29   !sCheck.anRef )
38350 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  {.    unlockBtre
38360 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
38370 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a      *pnErr = 1;.
38380 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
38390 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
383a0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
383b0 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b  r(i=0; i<=sCheck
383c0 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43  .nPage; i++){ sC
383d0 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
383e0 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49  0; }.  i = PENDI
383f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
38400 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65  );.  if( i<=sChe
38410 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  ck.nPage ){.    
38420 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20  sCheck.anRef[i] 
38430 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
38440 65 33 53 74 72 41 63 63 75 6d 49