/ Hex Artifact Content
Login

Artifact 3dffdafe21bf727f0e3409436ac65e3d7b319673:


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 39 37 20 32 30 30 39 2f 30  c,v 1.597 2009/0
0190: 34 2f 32 39 20 30 36 3a 32 37 3a 35 37 20 64 61  4/29 06:27:57 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 2a 0a 2a 2a 20 41 63  builds..**.** Ac
0530: 63 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72  cess to this var
0540: 69 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74  iable is protect
0550: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54  ed by SQLITE_MUT
0560: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
0570: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0580: 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64  TE_TEST.BtShared
0590: 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c   *SQLITE_WSD sql
05a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
05b0: 69 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ist = 0;.#else.s
05c0: 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a  tatic BtShared *
05d0: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
05e0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05f0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  t = 0;.#endif.#e
0600: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0610: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0620: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0630: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0640: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0650: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0660: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0670: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0690: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
06a0: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06c0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06d0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06e0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06f0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
0700: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0710: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0720: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0730: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0740: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0750: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0760: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0780: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0790: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
07a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
07b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
07c0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
07d0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
07e0: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52 65 61   int checkForRea
07f0: 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65  dConflicts(Btree
0800: 2a 2c 20 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f  *, Pgno, BtCurso
0810: 72 2a 2c 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64  r*, i64);...#ifd
0820: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0830: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0840: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0850: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0860: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0870: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0880: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0890: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
08a0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
08b0: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
08c0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
08d0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
08e0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
08f0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0900: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0910: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0920: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0930: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0940: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0950: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0960: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0970: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0980: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0990: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
09a0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
09b0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
09c0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
09d0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
09e0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
09f0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0a00: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0a10: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0a20: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0a30: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0a40: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0a50: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0a60: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0a70: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0a80: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0a90: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 23  eTableLocks(a).#
0aa0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0ab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ac0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51 75  D_CACHE./*.** Qu
0ad0: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
0ae0: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
0af0: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
0b00: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
0b10: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
0b20: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
0b30: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
0b40: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
0b50: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
0b60: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
0b70: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
0b80: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53   calling.** setS
0b90: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ba0: 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54  ock()), or SQLIT
0bb0: 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e  E_LOCKED if not.
0bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71  .*/.static int q
0bd0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0bf0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0c00: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0c10: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0c20: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0c30: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0c40: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0c50: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
0c60: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
0c70: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
0c80: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
0c90: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
0ca0: 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
0cb0: 72 65 71 75 65 73 74 69 6e 67 20 61 20 77 72 69  requesting a wri
0cc0: 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  te-lock, then th
0cd0: 65 20 42 74 72 65 65 20 6d 75 73 74 20 68 61 76  e Btree must hav
0ce0: 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a  e an open write.
0cf0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
0d00: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41   on this file. A
0d10: 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66  nd, obviously, f
0d20: 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f  or this to be so
0d30: 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73   there .  ** mus
0d40: 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  t be an open wri
0d50: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
0d60: 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  n the file itsel
0d70: 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  f..  */.  assert
0d80: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
0d90: 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70  CK || (p==pBt->p
0da0: 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54  Writer && p->inT
0db0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
0dc0: 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
0dd0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
0de0: 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
0df0: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
0e00: 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  ITE );.  .  /* T
0e10: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
0e20: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
0e30: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
0e40: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
0e50: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
0e60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0e70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  .  }..  /* If so
0e80: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
0e90: 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ion is holding a
0ea0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
0eb0: 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65  , the.  ** reque
0ec0: 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f  sted lock may no
0ed0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20  t be obtained.. 
0ee0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
0ef0: 57 72 69 74 65 72 21 3d 70 20 26 26 20 70 42 74  Writer!=p && pBt
0f00: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ->isExclusive ){
0f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
0f20: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
0f30: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
0f40: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
0f50: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
0f60: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
0f70: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c  }..  /* This (al
0f80: 6f 6e 67 20 77 69 74 68 20 73 65 74 53 68 61 72  ong with setShar
0f90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0fa0: 28 29 29 20 69 73 20 77 68 65 72 65 0a 20 20 2a  ()) is where.  *
0fb0: 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  * the ReadUncomm
0fc0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 64 65  itted flag is de
0fd0: 61 6c 74 20 77 69 74 68 2e 0a 20 20 2a 2a 20 49  alt with..  ** I
0fe0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
0ff0: 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72  querying for a r
1000: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 61 6e 79 20  ead-lock on any 
1010: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 74 68 65 72  table.  ** other
1020: 20 74 68 61 6e 20 74 68 65 20 73 71 6c 69 74 65   than the sqlite
1030: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 74  _master table (t
1040: 61 62 6c 65 20 31 29 20 61 6e 64 20 69 66 20 74  able 1) and if t
1050: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
1060: 65 64 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  ed.  ** flag is 
1070: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  set, then the lo
1080: 63 6b 20 67 72 61 6e 74 65 64 20 65 76 65 6e 20  ck granted even 
1090: 69 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69  if there are wri
10a0: 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e  te-locks.  ** on
10b0: 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61   the table. If a
10c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72   write-lock is r
10d0: 65 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65  equested, the Re
10e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
10f0: 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63  ag.  ** is not c
1100: 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a  onsidered..  **.
1110: 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e    ** In function
1120: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
1130: 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 69 66 20 61  ableLock(), if a
1140: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65   read-lock is de
1150: 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a  manded and the .
1160: 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69    ** ReadUncommi
1170: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
1180: 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64  , no entry is ad
1190: 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73  ded to the locks
11a0: 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53   list .  ** (BtS
11b0: 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20  hared.pLock)..  
11c0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61  **.  ** To summa
11d0: 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61  rize: If the Rea
11e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
11f0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72  g is set, then r
1200: 65 61 64 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ead cursors.  **
1210: 20 6f 6e 20 6e 6f 6e 2d 73 63 68 65 6d 61 20 74   on non-schema t
1220: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 63 72 65  ables do not cre
1230: 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74  ate or respect t
1240: 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20  able locks. The 
1250: 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 70 72 6f  locking.  ** pro
1260: 63 65 64 75 72 65 20 66 6f 72 20 61 20 77 72 69  cedure for a wri
1270: 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  te-cursor does n
1280: 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  ot change..  */.
1290: 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d 28 70    if( .    0==(p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
12b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
12c0: 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63  ed) || .    eLoc
12d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
12e0: 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45  .    iTab==MASTE
12f0: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1300: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1310: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1320: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1330: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
1340: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
1350: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
1360: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1370: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 20 20 2a  if(...) .      *
1380: 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61  * statement is a
1390: 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
13a0: 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
13b0: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
13c0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
13d0: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
13e0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 2a 2a  E_LOCK).      **
13f0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20  .      ** since 
1400: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20  we know that if 
1410: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1420: 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72  K, then no other
1430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
1440: 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20    ** may hold a 
1450: 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e  WRITE_LOCK on an
1460: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20  y table in this 
1470: 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72  file (since ther
1480: 65 20 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  e can.      ** o
1490: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
14a0: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 20 20 2a  writer)..      *
14b0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
14d0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
14e0: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
14f0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
1500: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
1510: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1520: 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74  pBtree==p || pIt
1530: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
1540: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
1550: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1560: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
1570: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
1580: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
1590: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15a0: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
15b0: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
15c0: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
15d0: 20 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b         if( eLock
15e0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a  ==WRITE_LOCK ){.
15f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1600: 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65  ( p==pBt->pWrite
1610: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
1620: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
1630: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1640: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1650: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1660: 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CACHE;.      }. 
1670: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1690: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
16a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16b0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
16c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16d0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
16e0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
16f0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1700: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
1710: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
1720: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
1730: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
1740: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
1750: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
1760: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
1770: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
1780: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1790: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
17a0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
17b0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
17c0: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
17d0: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
17e0: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
17f0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
1800: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1810: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
1820: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1830: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1840: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1850: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
1860: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
1870: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
1880: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1890: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
18a0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
18b0: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
18c0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
18d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
18e0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
18f0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1900: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1910: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1920: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1930: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1950: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
1960: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
1970: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1980: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
1990: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  k) );..  /* If t
19a0: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
19b0: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
19c0: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
19d0: 69 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 0a  is requested on.
19e0: 20 20 2a 2a 20 61 20 6e 6f 6e 2d 73 63 68 65 6d    ** a non-schem
19f0: 61 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  a table, then th
1a00: 65 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  e lock is always
1a10: 20 67 72 61 6e 74 65 64 2e 20 20 52 65 74 75 72   granted.  Retur
1a20: 6e 20 65 61 72 6c 79 0a 20 20 2a 2a 20 77 69 74  n early.  ** wit
1a30: 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65  hout adding an e
1a40: 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68  ntry to the BtSh
1a50: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e  ared.pLock list.
1a60: 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e   See.  ** commen
1a70: 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75  t in function qu
1a80: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1a90: 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f  bleLock() for mo
1aa0: 72 65 20 69 6e 66 6f 0a 20 20 2a 2a 20 6f 6e 20  re info.  ** on 
1ab0: 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 65 61  handling the Rea
1ac0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
1ad0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
1ae0: 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73     (p->db->flags
1af0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1b00: 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20 20 20  mmitted) && .   
1b10: 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f   (eLock==READ_LO
1b20: 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c  CK) &&.    iTabl
1b30: 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  e!=MASTER_ROOT. 
1b40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1b50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1b60: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
1b70: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
1b80: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
1b90: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
1ba0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1bb0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1bc0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1bd0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
1be0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1bf0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
1c00: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
1c10: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
1c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c30: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1c40: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
1c50: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
1c60: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
1c70: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
1c80: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
1c90: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
1ca0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
1cb0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
1cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
1cd0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
1ce0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
1cf0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1d00: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
1d10: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
1d20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d40: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
1d50: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
1d60: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
1d70: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
1d80: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1d90: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
1da0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
1db0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
1dc0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
1dd0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
1de0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
1df0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
1e00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1e10: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
1e20: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
1e30: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
1e40: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
1e50: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
1e60: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
1e70: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
1e80: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
1e90: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
1ea0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
1eb0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
1ec0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
1ed0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
1ee0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
1ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f00: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1f10: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1f20: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
1f30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1f40: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
1f50: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
1f60: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
1f70: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
1f80: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
1f90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1fa0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
1fb0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1fc0: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2a 0a  ee handle p..**.
1fd0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fe0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 68 61   assumes that ha
1ff0: 6e 64 6c 65 20 70 20 68 61 73 20 61 6e 20 6f 70  ndle p has an op
2000: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2010: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
2020: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
2030: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 53 68 61  , then the BtSha
2040: 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 76 61  red.isPending va
2050: 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65  riable.** may be
2060: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c 65   incorrectly cle
2070: 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
2080: 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68 61  void clearAllSha
2090: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
20a0: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
20b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20c0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
20d0: 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74   **ppIter = &pBt
20e0: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65  ->pLock;..  asse
20f0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2100: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2110: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2120: 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70  arable || 0==*pp
2130: 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  Iter );.  assert
2140: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29  ( p->inTrans>0 )
2150: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49  ;..  while( *ppI
2160: 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  ter ){.    BtLoc
2170: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74  k *pLock = *ppIt
2180: 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
2190: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
21a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
21b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
21c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
21d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
21e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
21f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
2200: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
2210: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
2220: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
2230: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
2240: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
2250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2260: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
2270: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2280: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  }..  assert( pBt
2290: 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20 7c  ->isPending==0 |
22a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
22b0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
22c0: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
22d0: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
22e0: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
22f0: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
2300: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
2310: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
2320: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
2330: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
2340: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2350: 61 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e 6e 65  alled when conne
2360: 63 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e 63 6c  ction p is concl
2370: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
2380: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2390: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
23a0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
23b0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
23c0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
23d0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
23e0: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
23f0: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
2400: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
2410: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
2420: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
2430: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
2440: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
2450: 20 73 65 74 20 74 68 65 20 69 73 50 65 6e 64 69   set the isPendi
2460: 6e 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20  ng flag to 0..  
2470: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2480: 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72  here is not curr
2490: 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20  ently a writer, 
24a0: 74 68 65 6e 20 42 74 53 68 61 72 65 64 2e 69 73  then BtShared.is
24b0: 50 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20 20 20  Pending must.   
24c0: 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65   ** be zero alre
24d0: 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78  ady. So this nex
24e0: 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65  t line is harmle
24f0: 73 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ss in that case.
2500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
2510: 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  >isPending = 0;.
2520: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
2530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2540: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
2550: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
2560: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2570: 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  age);  /* Forwar
2580: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a  d reference */..
2590: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
25a0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
25b0: 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  ds a mutex on th
25c0: 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  e BtShared.*/.#i
25d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
25e0: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f  tic int cursorHo
25f0: 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f  ldsMutex(BtCurso
2600: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
2610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2620: 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
2630: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
2640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2650: 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a  T_INCRBLOB./*.**
2660: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
2670: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2680: 73 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72  st cache for cur
2690: 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79  sor pCur, if any
26a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26b0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
26c0: 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f  lowCache(BtCurso
26d0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
26e0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26f0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2700: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
2710: 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
2720: 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2730: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2740: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
2750: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2760: 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63   cache for all c
2770: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
2780: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
2790: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
27a0: 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Bt..*/.static vo
27b0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  id invalidateAll
27c0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
27d0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
27e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
27f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2800: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2810: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70  utex) );.  for(p
2820: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2830: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2840: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
2850: 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20  rflowCache(p);. 
2860: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65   }.}.#else.  #de
2870: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
2880: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
2890: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
28a0: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
28b0: 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a  ache(x).#endif..
28c0: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
28d0: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
28e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
28f0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
2900: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
2910: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
2920: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
2930: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
2940: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
2950: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
2960: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
2970: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
2980: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
2990: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
29a0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
29b0: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
29c0: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
29d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
29e0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
29f0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2a00: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2a10: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
2a20: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
2a30: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
2a40: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
2a50: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
2a60: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
2a70: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2a80: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
2a90: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
2aa0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
2ab0: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
2ac0: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
2ad0: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
2ae0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
2af0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
2b00: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
2b10: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
2b20: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
2b30: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
2b40: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
2b50: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
2b60: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
2b70: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
2b80: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
2b90: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
2ba0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
2bb0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2bc0: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
2bd0: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
2be0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
2bf0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
2c00: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
2c10: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
2c20: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
2c30: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
2c40: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
2c50: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
2c60: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
2c70: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
2c80: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
2c90: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
2ca0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
2cb0: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
2cc0: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
2cd0: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
2ce0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
2cf0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
2d00: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
2d10: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
2d20: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
2d30: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
2d40: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
2d50: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
2d60: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
2d70: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
2d80: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
2d90: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
2da0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
2db0: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
2dc0: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
2dd0: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
2de0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
2df0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
2e00: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
2e10: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
2e20: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
2e30: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
2e40: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
2e50: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
2e60: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
2e70: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
2e80: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
2e90: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
2ea0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
2eb0: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
2ec0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
2ed0: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
2ee0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
2ef0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
2f00: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
2f10: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
2f20: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
2f30: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
2f40: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
2f50: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
2f60: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
2f70: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
2f80: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
2f90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2fa0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
2fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fc0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
2fd0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
2fe0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2ff0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3000: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
3010: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
3020: 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20     int nPage;.  
3030: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3040: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
3050: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
3060: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
3070: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3080: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
3090: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
30a0: 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50  ecCreate((u32)nP
30b0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
30c0: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
30d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
30e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
30f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3100: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
3110: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
3120: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
3130: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
3140: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
3150: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
3160: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
3170: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
3180: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3190: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
31a0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
31b0: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
31c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
31d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
31e0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
31f0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
3200: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
3210: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
3220: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
3230: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
3240: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
3250: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
3260: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
3270: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
3280: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
3290: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
32a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
32b0: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
32c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
32d0: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
32e0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
32f0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
3300: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
3310: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
3320: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
3330: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
3350: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
3360: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3370: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
3380: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
3390: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
33a0: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
33b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
33c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
33d0: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
33e0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
33f0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
3400: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
3410: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
3420: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
3430: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
3440: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
3450: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
3460: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
3470: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
3480: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
3490: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
34a0: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
34b0: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
34c0: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
34d0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
34e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
34f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
3500: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3510: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
3520: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
3530: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
3540: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
3550: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3560: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
3570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3580: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
3590: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
35a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
35b0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
35c0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
35d0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
35e0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
35f0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
3600: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
3610: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
3620: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
3630: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
3640: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
3650: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
3660: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
3670: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
3680: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
3690: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
36a0: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
36b0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
36c0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
36d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36e0: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61  && 0==pCur->apPa
36f0: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a  ge[0]->intKey){.
3700: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
3710: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
3720: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
3730: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
3740: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
3750: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
3760: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
3770: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
3780: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
3790: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37a0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
37b0: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
37c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37d0: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
37e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
3800: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
3810: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
3820: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
3830: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
3840: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
3850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3860: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3870: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
3880: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
3890: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
38a0: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
38b0: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
38c0: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
38d0: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
38e0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
38f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
3900: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
3910: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
3920: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3930: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
3940: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
3950: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
3960: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
3970: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
3980: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
3990: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
39a0: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
39b0: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
39c0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
39d0: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
39e0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
39f0: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
3a00: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
3a10: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
3a20: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
3a30: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
3a40: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
3a50: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
3a60: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
3a70: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3a80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3a90: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3aa0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3ab0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
3ac0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
3ad0: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3ae0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3af0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3b00: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
3b10: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
3b20: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
3b30: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
3b40: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
3b50: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
3b60: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
3b70: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
3b80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
3b90: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
3ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
3bb0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3be0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
3bf0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
3c00: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
3c10: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
3c20: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
3c30: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3c40: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
3c50: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3c60: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
3c70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
3c80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
3c90: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
3ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
3cb0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
3cc0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
3cd0: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
3ce0: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
3cf0: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
3d00: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
3d10: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
3d20: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
3d30: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
3d40: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
3d50: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
3d60: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
3d70: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
3d80: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
3d90: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
3da0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3db0: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
3dc0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
3dd0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
3de0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
3df0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
3e00: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
3e10: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
3e20: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
3e30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
3e40: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
3e50: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
3e60: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
3e70: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
3e80: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
3e90: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
3ea0: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
3eb0: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
3ec0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
3ed0: 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  LID;.  rc = sqli
3ee0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
3ef0: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
3f00: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
3f10: 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20  &pCur->skip);.  
3f20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3f30: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
3f40: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
3f50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
3f60: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
3f70: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
3f80: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
3f90: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
3fa0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
3fb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3fc0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
3fd0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3fe0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
3ff0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
4000: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
4010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
4020: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
4030: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
4040: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
4050: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
4060: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
4070: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
4080: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
4090: 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61  osition it.** wa
40a0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74  s last placed at
40b0: 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  .  Cursors can m
40c0: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
40d0: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
40e0: 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65  ng.** at is dele
40f0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
4100: 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er them..**.** T
4110: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4120: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rns an error cod
4130: 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  e if something g
4140: 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a  oes wrong.  The.
4150: 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73  ** integer *pHas
4160: 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
4170: 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  one if the curso
4180: 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20  r has moved and 
4190: 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74  0 if not..*/.int
41a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
41b0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
41c0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
41d0: 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69  *pHasMoved){.  i
41e0: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  nt rc;..  rc = r
41f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
4200: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
4210: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61  ( rc ){.    *pHa
4220: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  sMoved = 1;.    
4230: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
4240: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
4250: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
4260: 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30  || pCur->skip!=0
4270: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76   ){.    *pHasMov
4280: 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
4290: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
42a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
42b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
42c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
42d0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
42e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
42f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
4300: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
4310: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
4320: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
4330: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
4340: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
4350: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
4360: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
4370: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   page number..*/
4380: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
4390: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
43a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
43b0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
43c0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
43d0: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
43e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
43f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4400: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4410: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
4420: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
4430: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
4440: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
4450: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
4460: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
4470: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
4480: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
4490: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
44a0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
44b0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
44c0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
44d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
44e0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
44f0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
4500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
4510: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
4520: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
4530: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
4540: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
4550: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
4560: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
4570: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
4580: 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  '..** An error c
4590: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
45a0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
45b0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
45c0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
45d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
45e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
45f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
4600: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
4610: 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20  rent){.  DbPage 
4620: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
4630: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
4640: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
4650: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
4660: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
4670: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
4680: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
4690: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
46a0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
46b0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
46c0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
46d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
46e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
46f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4700: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
4710: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
4720: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
4730: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
4740: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
4750: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
4760: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
4770: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
4780: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
4790: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
47a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
47b0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
47c0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
47d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
47e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
47f0: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
4800: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
4810: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
4820: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
4830: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
4840: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
4850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4860: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
4870: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
4880: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
4890: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
48a0: 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  key);.  pPtrmap 
48b0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
48c0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
48d0: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
48e0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
48f0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
4900: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
4910: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
4920: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
4930: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
4940: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
4950: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
4960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4970: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
4980: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
4990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
49a0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
49b0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
49c0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
49d0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
49e0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
49f0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67   }..  sqlite3Pag
4a00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
4a10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4a20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
4a30: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
4a40: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
4a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
4a60: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
4a70: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
4a80: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
4a90: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
4aa0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
4ab0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
4ac0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
4ad0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
4ae0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
4af0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
4b00: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b10: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
4b20: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
4b30: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
4b40: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b50: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
4b60: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
4b70: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
4b80: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
4b90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
4ba0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
4bb0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
4bc0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
4bd0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
4be0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
4bf0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
4c00: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
4c10: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
4c20: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
4c30: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
4c40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4c50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4c60: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4c70: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
4c80: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
4c90: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
4ca0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
4cb0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
4cc0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
4cd0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
4ce0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4cf0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
4d00: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
4d10: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
4d20: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
4d30: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
4d40: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
4d50: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
4d60: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
4d70: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
4d80: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
4d90: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
4da0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
4db0: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
4dc0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
4dd0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
4de0: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
4df0: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
4e00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
4e10: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
4e20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
4e30: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
4e40: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
4e50: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
4e60: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
4e70: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
4e80: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
4e90: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
4ea0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
4eb0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
4ec0: 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  l(y,z) SQLITE_OK
4ed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
4ee0: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
4ef0: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
4f00: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
4f10: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
4f20: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
4f30: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
4f40: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
4f50: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
4f60: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
4f70: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
4f80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
4f90: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
4fa0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
4fb0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
4fc0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
4fd0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
4fe0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
4ff0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
5000: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
5010: 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c  ->aData[(P)->cel
5020: 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29  lOffset+2*(I)]))
5030: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  )../*.** This a 
5040: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
5050: 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c  sion of findCell
5060: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
5070: 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20  r.** pages that 
5080: 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  do contain overf
5090: 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20  low cells.  See 
50a0: 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63  insert.*/.static
50b0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
50c0: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
50d0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
50e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
50f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5100: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5110: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5120: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
5130: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
5140: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
5150: 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66  .    struct _Ovf
5160: 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20  lCell *pOvfl;.  
5170: 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65    pOvfl = &pPage
5180: 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  ->aOvfl[i];.    
5190: 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a  k = pOvfl->idx;.
51a0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
51b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
51c0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
51d0: 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e    return pOvfl->
51e0: 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pCell;.      }. 
51f0: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
5200: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5210: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
5220: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
5230: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
5240: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
5250: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
5260: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
5270: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
5280: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
5290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73  his function.  s
52a0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
52b0: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
52c0: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
52d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
52e0: 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33  ment and sqlite3
52f0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
5300: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
5310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
5320: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
5330: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
5340: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
5350: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
5360: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
5370: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
5380: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
5390: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
53a0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
53b0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
53c0: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
53d0: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64   faster..*/.void
53e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
53f0: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
5400: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
5410: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
5420: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
5430: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5450: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
5460: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
5470: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
5480: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
5490: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
54a0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
54d0: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
54e0: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
54f0: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
5500: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5510: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
5520: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
5530: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5540: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
5550: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
5560: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
5570: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
5580: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
5590: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
55a0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
55b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
55c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
55d0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
55e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
55f0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
5600: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
5610: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
5620: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
5630: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
5640: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5650: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
5660: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
5670: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
5680: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
5690: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
56a0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
56b0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
56c0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
56d0: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
56e0: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
56f0: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
5700: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
5710: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
5720: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
5730: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
5740: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
5750: 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  n;.  if( likely(
5760: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
5770: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
5780: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
5790: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
57a0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
57b0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
57c0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
57d0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
57e0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
57f0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
5800: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
5810: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
5820: 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  ze of cell conte
5830: 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  nt in bytes */. 
5840: 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c     nSize = nPayl
5850: 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  oad + n;.    pIn
5860: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
5870: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
5880: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
5890: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e   = 0;.    if( (n
58a0: 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b  Size & ~3)==0 ){
58b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
58c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
58d0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
58e0: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
58f0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
5900: 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  u16)nSize;.  }el
5910: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5920: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
5930: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
5940: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
5950: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
5960: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
5970: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
5980: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
5990: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
59a0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
59b0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
59c0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
59d0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
59e0: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
59f0: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
5a00: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
5a10: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
5a20: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
5a30: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
5a40: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
5a50: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
5a60: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
5a70: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
5a80: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
5a90: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
5aa0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
5ab0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
5ac0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
5ad0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
5ae0: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
5af0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
5b00: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
5b10: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b20: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5b30: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
5b40: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
5b50: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b60: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5b70: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
5b80: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
5b90: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
5ba0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
5bb0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
5bc0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
5bd0: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
5be0: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
5bf0: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
5c00: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
5c10: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
5c20: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
5c30: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
5c40: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
5c50: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
5c60: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
5c70: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
5c80: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
5c90: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
5ca0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
5cb0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
5cc0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
5cd0: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
5ce0: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
5cf0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
5d00: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
5d10: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
5d20: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
5d30: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
5d40: 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  \.  sqlite3Btree
5d50: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50  ParseCellPtr((pP
5d60: 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28  age), findCell((
5d70: 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29  pPage), (iCell))
5d80: 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20  , (pInfo)).void 
5d90: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
5da0: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
5db0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
5dc0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
5dd0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
5de0: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
5df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5e00: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
5e10: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
5e20: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
5e30: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
5e40: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
5e50: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72  ture */.){.  par
5e60: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
5e70: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ell, pInfo);.}..
5e80: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
5e90: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
5ea0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
5eb0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
5ec0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
5ed0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
5ee0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
5ef0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
5f00: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
5f10: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
5f20: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
5f30: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
5f40: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
5f50: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
5f60: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
5f70: 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ter..*/.#ifndef 
5f80: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31  NDEBUG.static u1
5f90: 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  6 cellSize(MemPa
5fa0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
5fb0: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
5fc0: 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  o info;.  sqlite
5fd0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
5fe0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69  pPage, iCell, &i
5ff0: 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nfo);.  return i
6000: 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e  nfo.nSize;.}.#en
6010: 64 69 66 0a 73 74 61 74 69 63 20 75 31 36 20 63  dif.static u16 c
6020: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
6030: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
6040: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
6050: 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  o info;.  sqlite
6060: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
6070: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
6080: 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72   &info);.  retur
6090: 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a  n info.nSize;.}.
60a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
60b0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
60c0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
60d0: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
60e0: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
60f0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
6100: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
6110: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
6120: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
6130: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
6140: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
6150: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
6160: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
6170: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
6180: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
6190: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
61a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
61b0: 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l!=0 );.  sqlite
61c0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
61d0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
61e0: 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
61f0: 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
6200: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
6210: 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
6220: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
6230: 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
6240: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
6250: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
6260: 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
6270: 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
6280: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
6290: 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
62a0: 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50    return ptrmapP
62b0: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
62c0: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
62d0: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
62e0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
62f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
6300: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
6310: 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c   with index iCel
6320: 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20  l on page pPage 
6330: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
6340: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
6350: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
6360: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
6370: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
6380: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
6390: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
63a0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
63b0: 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tOvfl(MemPage *p
63c0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
63d0: 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  {.  u8 *pCell;. 
63e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
63f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
6400: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
6410: 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
6420: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
6430: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65  ge, iCell);.  re
6440: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76  turn ptrmapPutOv
6450: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
6460: 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ll);.}.#endif...
6470: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
6480: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
6490: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
64a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
64b0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
64c0: 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61  and all free spa
64d0: 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ce is collected 
64e0: 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20  into one.** big 
64f0: 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63  FreeBlk that occ
6500: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74  urs in between t
6510: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65  he header and ce
6520: 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72  ll.** pointer ar
6530: 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ray and the cell
6540: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a   content area..*
6550: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
6560: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
6570: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
6580: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
6590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
65a0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
65b0: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
65c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
65d0: 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63  ress of a i-th c
65e0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ell */.  int add
65f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
6600: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
6610: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
6620: 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  r cell pointer a
6630: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rray */.  int hd
6640: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
6650: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
6660: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
6670: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
66a0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
66b0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
66c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
66d0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
66e0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
66f0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
6700: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
6710: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
6720: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
6730: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
6740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6750: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
6760: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
6770: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6790: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
67a0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
67b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
67c0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
67d0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
67e0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
67f0: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
6800: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
6810: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
6820: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6830: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
6840: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
6850: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
6860: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
6870: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
6880: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
6890: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
68a0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
68b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
68c0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
68d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
68e0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
68f0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6900: 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65  .  temp = sqlite
6910: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
6920: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
6930: 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  er);.  data = pP
6940: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
6950: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
6960: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
6970: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
6980: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
6990: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
69a0: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
69b0: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
69c0: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
69d0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
69e0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
69f0: 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
6a00: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
6a10: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
6a20: 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  p[cbrk], &data[c
6a30: 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
6a40: 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b   - cbrk);.  cbrk
6a50: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
6a60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
6a70: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
6a80: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
6a90: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
6aa0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
6ab0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
6ac0: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
6ad0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
6ae0: 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Addr);.    if( p
6af0: 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  c>=usableSize ){
6b00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6b10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
6b20: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69 7a  T;.    }.    siz
6b30: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  e = cellSizePtr(
6b40: 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d  pPage, &temp[pc]
6b50: 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73  );.    cbrk -= s
6b60: 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72  ize;.    if( cbr
6b70: 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  k<cellOffset+2*n
6b80: 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  Cell || pc+size>
6b90: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
6ba0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6bb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6bc0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
6bd0: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
6be0: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
6bf0: 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  =0 );.    memcpy
6c00: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74  (&data[cbrk], &t
6c10: 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  emp[pc], size);.
6c20: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
6c30: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20  dr, cbrk);.  }. 
6c40: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63   assert( cbrk>=c
6c50: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
6c60: 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l );.  put2byte(
6c70: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
6c80: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
6c90: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
6ca0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
6cb0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
6cc0: 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65  addr = cellOffse
6cd0: 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d  t+2*nCell;.  mem
6ce0: 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  set(&data[addr],
6cf0: 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a   0, cbrk-addr);.
6d00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6d10: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6d20: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6d30: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
6d40: 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e 46 72  addr!=pPage->nFr
6d50: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
6d60: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6d70: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
6d80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6d90: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6da0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
6db0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
6dc0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
6dd0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
6de0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6df0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  . Return the ind
6e00: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
6e10: 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 0a 2a  Data[] of the .*
6e20: 2a 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  * first byte of 
6e30: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
6e40: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c   .**.** The call
6e50: 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  er guarantees th
6e60: 61 74 20 74 68 65 20 73 70 61 63 65 20 62 65 74  at the space bet
6e70: 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
6e80: 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20  the cell-offset 
6e90: 0a 2a 2a 20 61 72 72 61 79 20 61 6e 64 20 74 68  .** array and th
6ea0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
6eb0: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
6ec0: 20 69 73 20 61 74 20 6c 65 61 73 74 20 6e 42 79   is at least nBy
6ed0: 74 65 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 73  te bytes.** in s
6ee0: 69 7a 65 2e 20 53 6f 20 74 68 69 73 20 72 6f 75  ize. So this rou
6ef0: 74 69 6e 65 20 63 61 6e 20 6e 65 76 65 72 20 66  tine can never f
6f00: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ail..**.** If th
6f10: 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
6f20: 36 30 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73  60 or more bytes
6f30: 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 77 69   of fragments wi
6f40: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 0a 2a  thin the page,.*
6f50: 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 64 65  * the page is de
6f60: 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72  fragmented befor
6f70: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 66 20  e returning. If 
6f80: 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20 64 6f  this were not do
6f90: 6e 65 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  ne there.** is a
6fa0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
6fb0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d   number of fragm
6fc0: 65 6e 74 65 64 20 62 79 74 65 73 20 63 6f 75 6c  ented bytes coul
6fd0: 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a  d eventually .**
6fe0: 20 6f 76 65 72 66 6c 6f 77 20 74 68 65 20 73 69   overflow the si
6ff0: 6e 67 6c 65 2d 62 79 74 65 20 66 69 65 6c 64 20  ngle-byte field 
7000: 6f 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  of the page-head
7010: 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 69 73  er in which this
7020: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 74 6f   value.** is sto
7030: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
7040: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
7050: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7060: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 63   int nByte){.  c
7070: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
7080: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
7090: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
70a0: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72  he of pPage->hdr
70b0: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a  Offset */.  u8 *
70c0: 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
70d0: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
70e0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
70f0: 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  of pPage->aData 
7100: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20  */.  int nFrag; 
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7130: 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65  ber of fragmente
7140: 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65  d bytes on pPage
7150: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20   */.  int top;. 
7160: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
7170: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
7180: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
7190: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
71a0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
71b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
71c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
71d0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
71e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
71f0: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
7200: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
7210: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
7220: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
7230: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
7240: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
7250: 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  w==0 );..  /* As
7260: 73 65 72 74 20 74 68 61 74 20 74 68 65 20 73 70  sert that the sp
7270: 61 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  ace between the 
7280: 63 65 6c 6c 2d 6f 66 66 73 65 74 20 61 72 72 61  cell-offset arra
7290: 79 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20  y and the .  ** 
72a0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
72b0: 61 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  a is greater tha
72c0: 6e 20 6e 42 79 74 65 20 62 79 74 65 73 2e 0a 20  n nByte bytes.. 
72d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 42   */.  assert( nB
72e0: 79 74 65 20 3c 3d 20 28 0a 20 20 20 20 20 20 67  yte <= (.      g
72f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
7300: 72 2b 35 5d 29 2d 28 68 64 72 2b 38 2b 28 70 50  r+5])-(hdr+8+(pP
7310: 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 2b 32  age->leaf?0:4)+2
7320: 2a 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  *get2byte(&data[
7330: 68 64 72 2b 33 5d 29 29 0a 20 20 29 29 3b 0a 0a  hdr+3])).  ));..
7340: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
7350: 3d 20 28 75 31 36 29 6e 42 79 74 65 3b 0a 20 20  = (u16)nByte;.  
7360: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
7370: 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  +7];.  if( nFrag
7380: 3e 3d 36 30 20 29 7b 0a 20 20 20 20 64 65 66 72  >=60 ){.    defr
7390: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
73a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
73b0: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
73c0: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
73d0: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
73e0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
73f0: 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  isfy .    ** the
7400: 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c   request. The al
7410: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65  location is made
7420: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
7430: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20  free slot in .  
7440: 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68    ** the list th
7450: 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  at is large enou
7460: 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 65  gh to accomadate
7470: 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
7480: 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20  int pc, addr;.  
7490: 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31    for(addr=hdr+1
74a0: 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65  ; (pc = get2byte
74b0: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30  (&data[addr]))>0
74c0: 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20  ; addr=pc){.    
74d0: 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74    int size = get
74e0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
74f0: 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ]);     /* Size 
7500: 6f 66 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  of free slot */.
7510: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d        if( size>=
7520: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
7530: 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20   int x = size - 
7540: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69  nByte;.        i
7550: 66 28 20 78 3c 34 20 29 7b 0a 09 20 20 2f 2a 20  f( x<4 ){..  /* 
7560: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
7570: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
7580: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
7590: 75 6d 62 65 72 20 6f 66 0a 09 20 20 2a 2a 20 66  umber of..  ** f
75a0: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
75b0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
75c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
75d0: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
75e0: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
75f0: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
7600: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
7610: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
7620: 20 20 7d 65 6c 73 65 7b 0a 09 20 20 2f 2a 20 54    }else{..  /* T
7630: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
7640: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
7650: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
7660: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 09 20 20  e to account..  
7670: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
7680: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
7690: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
76a0: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32  /.          put2
76b0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
76c0: 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , x);.        }.
76d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
76e0: 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20  c + x;.      }. 
76f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7700: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
7710: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
7720: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
7730: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
7740: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
7750: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20  content area..  
7760: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
7770: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7780: 29 20 2d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74  ) - nByte;.  put
7790: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
77a0: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75  5], top);.  retu
77b0: 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn top;.}../*.**
77c0: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
77d0: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
77e0: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
77f0: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
7800: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
7810: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
7820: 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73  s pPage->aDisk[s
7830: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
7840: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
7850: 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74  ck is "size" byt
7860: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f  es..**.** Most o
7870: 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72  f the effort her
7880: 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  e is involved in
7890: 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63   coalesing adjac
78a0: 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63  ent.** free bloc
78b0: 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ks into a single
78c0: 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e   big free block.
78d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
78e0: 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  reeSpace(MemPage
78f0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61   *pPage, int sta
7900: 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20  rt, int size){. 
7910: 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69   int addr, pbegi
7920: 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e  n, hdr;.  unsign
7930: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
7940: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20  pPage->aData;.. 
7950: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7960: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
7970: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7980: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
7990: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
79a0: 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d   assert( start>=
79b0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
79c0: 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f  +6+(pPage->leaf?
79d0: 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72 74  0:4) );.  assert
79e0: 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29  ( (start + size)
79f0: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
7a00: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
7a10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7a20: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
7a30: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7a40: 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30   assert( size>=0
7a50: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
7a60: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
7a70: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
7a80: 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
7a90: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
7aa0: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
7ab0: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
7ac0: 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44 45  en the SECURE_DE
7ad0: 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f  LETE .  ** optio
7ae0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20  n is enabled at 
7af0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a  compile-time */.
7b00: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73    memset(&data[s
7b10: 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b  tart], 0, size);
7b20: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
7b30: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
7b40: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
7b50: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
7b60: 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  cks */.  hdr = p
7b70: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
7b80: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
7b90: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
7ba0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
7bb0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61  data[addr]))<sta
7bc0: 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29  rt && pbegin>0 )
7bd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  {.    assert( pb
7be0: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
7bf0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
7c00: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
7c10: 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20 20 20 20  <=addr ) {.     
7c20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7c30: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c40: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62   }.    addr = pb
7c50: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 20 28  egin;.  }.  if (
7c60: 20 70 62 65 67 69 6e 3e 70 50 61 67 65 2d 3e 70   pbegin>pPage->p
7c70: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
7c80: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
7c90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7ca0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
7cb0: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c  t( pbegin>addr |
7cc0: 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20  | pbegin==0 );. 
7cd0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
7ce0: 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20  addr], start);. 
7cf0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
7d00: 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b  start], pbegin);
7d10: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7d20: 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65  a[start+2], size
7d30: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
7d40: 65 20 2b 3d 20 28 75 31 36 29 73 69 7a 65 3b 0a  e += (u16)size;.
7d50: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
7d60: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
7d70: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
7d80: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
7d90: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
7da0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
7db0: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
7dc0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
7dd0: 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20  xt, psize, x;.  
7de0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
7df0: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73  >addr );.    ass
7e00: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
7e10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7e20: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65  ize-4 );.    pne
7e30: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
7e40: 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20  ata[pbegin]);.  
7e50: 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79    psize = get2by
7e60: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
7e70: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  2]);.    if( pbe
7e80: 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20  gin + psize + 3 
7e90: 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78  >= pnext && pnex
7ea0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  t>0 ){.      int
7eb0: 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20   frag = pnext - 
7ec0: 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a  (pbegin+psize);.
7ed0: 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67 3c        if( (frag<
7ee0: 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74  0) || (frag>(int
7ef0: 29 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  )data[pPage->hdr
7f00: 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b 0a 20 20  Offset+7]) ){.  
7f10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7f20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7f30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7f40: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
7f50: 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28 75 38 29  ffset+7] -= (u8)
7f60: 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20  frag;.      x = 
7f70: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
7f80: 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75  next]);.      pu
7f90: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
7fa0: 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  gin], x);.      
7fb0: 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32  x = pnext + get2
7fc0: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
7fd0: 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20  +2]) - pbegin;. 
7fe0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
7ff0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78  ata[pbegin+2], x
8000: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8010: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
8020: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
8030: 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  /* If the cell c
8040: 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69  ontent area begi
8050: 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c  ns with a freebl
8060: 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20  ock, remove it. 
8070: 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64  */.  if( data[hd
8080: 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35  r+1]==data[hdr+5
8090: 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d  ] && data[hdr+2]
80a0: 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b  ==data[hdr+6] ){
80b0: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  .    int top;.  
80c0: 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62    pbegin = get2b
80d0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
80e0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
80f0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74  ata[hdr+1], &dat
8100: 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20  a[pbegin], 2);. 
8110: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
8120: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
8130: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
8140: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
8150: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
8160: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
8170: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
8180: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8190: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
81a0: 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
81b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
81c0: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
81d0: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
81e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
81f0: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
8200: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
8210: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
8220: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
8230: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
8240: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
8250: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
8260: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
8270: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
8280: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
8290: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
82a0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
82b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
82c0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
82d0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
82e0: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
82f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
8300: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
8310: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
8320: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
8330: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
8340: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
8350: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
8360: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8370: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
8380: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
8390: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
83a0: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
83b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
83c0: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
83d0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
83e0: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
83f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8400: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8410: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
8420: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
8430: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
8440: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
8450: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
8460: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
8470: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
8480: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
8490: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
84a0: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
84b0: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
84c0: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
84d0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
84e0: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
84f0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Key = 1;.    pPa
8500: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50  ge->hasData = pP
8510: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
8520: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
8530: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
8540: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
8550: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
8560: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
8570: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
8580: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  ODATA ){.    pPa
8590: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
85a0: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
85b0: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ta = 0;.    pPag
85c0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
85d0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
85e0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
85f0: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
8600: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8610: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8620: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
8630: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8640: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
8650: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
8660: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
8670: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
8680: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
8690: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
86a0: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
86b0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
86c0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
86d0: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
86e0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
86f0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
8700: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
8710: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
8720: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
8730: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
8740: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
8750: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
8760: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
8770: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
8780: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
8790: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
87a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
87b0: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
87c0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
87d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
87e0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
87f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8800: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8810: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
8820: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
8830: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
8840: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
8850: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8860: 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
8870: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
8880: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
8890: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
88a0: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
88b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
88c0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
88d0: 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20  Page) );..  if( 
88e0: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
88f0: 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20  {.    u16 pc;   
8900: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8910: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
8920: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
8930: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20  >aData[] */.    
8940: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
8950: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8960: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
8970: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
8980: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
8990: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
89a0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
89b0: 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
89c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
89d0: 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63  main btree struc
89e0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ture */.    u16 
89f0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
8a00: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
8a10: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
8a20: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
8a30: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
8a40: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
8a50: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
8a60: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
8a70: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46  er */.    u16 nF
8a80: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
8a90: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
8aa0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
8ab0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f  ge */.    u16 to
8ac0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
8ad0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
8ae0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8af0: 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  rea */..    pBt 
8b00: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
8b10: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
8b20: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
8b30: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
8b40: 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f  ta;.    if( deco
8b50: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
8b60: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
8b70: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8b80: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
8b90: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
8ba0: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
8bb0: 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29  ageSize<=32768 )
8bc0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
8bd0: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
8be0: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70  eSize - 1;.    p
8bf0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
8c00: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
8c10: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
8c20: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
8c30: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
8c40: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
8c50: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
8c60: 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20  leaf;.    top = 
8c70: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
8c80: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67  dr+5]);.    pPag
8c90: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
8ca0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
8cb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
8cc0: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
8cd0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
8ce0: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
8cf0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
8d00: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
8d10: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
8d20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8d30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8d40: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
8d50: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
8d60: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
8d70: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
8d80: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
8d90: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
8da0: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
8db0: 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63  dr+7] + top - (c
8dc0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
8dd0: 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
8de0: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
8df0: 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20        u16 next, 
8e00: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
8e10: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
8e20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
8e30: 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20  ee block is off 
8e40: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
8e50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8e60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
8e70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
8e80: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
8e90: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
8ea0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
8eb0: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
8ec0: 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20       if( next>0 
8ed0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
8ee0: 2b 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  +3 ){.        /*
8ef0: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
8f00: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
8f10: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
8f20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8f30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
8f40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
8f50: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20  ree += size;.   
8f60: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
8f70: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
8f80: 46 72 65 65 20 3d 20 28 75 31 36 29 6e 46 72 65  Free = (u16)nFre
8f90: 65 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  e;.    if( nFree
8fa0: 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  >=usableSize ){.
8fb0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70        /* Free sp
8fc0: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
8fd0: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
8fe0: 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
8ff0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9000: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 0a 23  _BKPT; .    }..#
9010: 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20  if 0.  /* Check 
9020: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66  that all the off
9030: 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  sets in the cell
9040: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72   offset array ar
9050: 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
9060: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74  .  ** .  ** Omit
9070: 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69 73  ting this consis
9080: 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64 20  tency check and 
9090: 75 73 69 6e 67 20 74 68 65 20 70 50 61 67 65 2d  using the pPage-
90a0: 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20  >maskPage mask. 
90b0: 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6f   ** to prevent o
90c0: 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20 70  verrunning the p
90d0: 61 67 65 20 62 75 66 66 65 72 20 69 6e 20 66 69  age buffer in fi
90e0: 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74 73  ndCell() results
90f0: 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20   in a.  ** 2.5% 
9100: 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e  performance gain
9110: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
9120: 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20  8 *pOff;        
9130: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
9140: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
9150: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
9160: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75  n range */.    u
9170: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
9180: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
9190: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
91a0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75 38   array */.    u8
91b0: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f   mask;         /
91c0: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
91d0: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
91e0: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
91f0: 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d  offsets */.    m
9200: 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42  ask = ~(((u8)(pB
9210: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29  t->pageSize>>8))
9220: 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20  -1);.    pEnd = 
9230: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9240: 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a   + pPage->nCell*
9250: 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66 66  2];.    for(pOff
9260: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
9270: 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20 26  t]; pOff!=pEnd &
9280: 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b  & !((*pOff)&mask
9290: 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20  ); pOff+=2);.   
92a0: 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20   if( pOff!=pEnd 
92b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
92c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
92d0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
92e0: 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61 67 65  endif..    pPage
92f0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
9300: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9310: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
9320: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
9330: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
9340: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
9350: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
9360: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
9370: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
9380: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
9390: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
93a0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
93b0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
93c0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
93d0: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
93e0: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
93f0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9400: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
9410: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9420: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
9430: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
9440: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
9450: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9460: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
9470: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
9480: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
9490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
94a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
94b0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
94c0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
94d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
94e0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
94f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
9500: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9510: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9520: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9530: 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68  /*memset(&data[h
9540: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
9550: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a  bleSize - hdr);*
9560: 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  /.  data[hdr] = 
9570: 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
9580: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
9590: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
95a0: 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20  EAF)==0 ?1:0);. 
95b0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
95c0: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
95d0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
95e0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
95f0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
9600: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
9610: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
9620: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
9630: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
9640: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
9650: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
9660: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
9670: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
9680: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
9690: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
96a0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
96b0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
96c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
96d0: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
96e0: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
96f0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
9700: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
9710: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
9720: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
9730: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
9740: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
9750: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
9760: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
9770: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
9780: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
9790: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
97a0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
97b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
97c0: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
97d0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
97e0: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
97f0: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
9800: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
9810: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
9820: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
9830: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
9840: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
9850: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
9860: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
9870: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
9880: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
9890: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
98a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
98b0: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
98c0: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
98d0: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
98e0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
98f0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
9900: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
9910: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
9920: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
9930: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
9940: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
9950: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
9960: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
9970: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
9980: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
9990: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
99a0: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
99b0: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
99c0: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
99d0: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
99e0: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
99f0: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
9a00: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
9a10: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
9a20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
9a30: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
9a40: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
9a50: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
9a60: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
9a70: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
9a80: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
9a90: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
9aa0: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
9ab0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
9ac0: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
9ad0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
9ae0: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
9af0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
9b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9b10: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
9b20: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
9b30: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
9b40: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
9b50: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
9b60: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
9b70: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
9b80: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
9b90: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
9ba0: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
9bb0: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
9bc0: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
9bd0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9be0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
9bf0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
9c00: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
9c10: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
9c20: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
9c30: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
9c40: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
9c50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
9c60: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
9c70: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
9c80: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
9c90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9ca0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
9cb0: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
9cc0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
9cd0: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
9ce0: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
9cf0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
9d00: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
9d10: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
9d20: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
9d30: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
9d40: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
9d50: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
9d60: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
9d70: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
9d80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
9d90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
9da0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
9db0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9dc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
9dd0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
9de0: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
9df0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
9e00: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
9e10: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
9e20: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
9e30: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
9e40: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
9e50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9e60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
9e70: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
9e80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9e90: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
9ea0: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
9eb0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
9ec0: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
9ed0: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
9ee0: 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65  c Pgno pagerPage
9ef0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
9f00: 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  pBt){.  int nPag
9f10: 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  e = -1;.  int rc
9f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
9f30: 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20  >pPage1 );.  rc 
9f40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
9f50: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
9f60: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
9f70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
9f80: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d  TE_OK || nPage==
9f90: 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  -1 );.  return (
9fa0: 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  Pgno)nPage;.}../
9fb0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
9fc0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
9fd0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
9fe0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
9ff0: 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e  ** is just a con
a000: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
a010: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
a020: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
a030: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
a040: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  () and sqlite3Bt
a050: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
a060: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
a070: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
a080: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
a090: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
a0a0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
a0b0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
a0c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a0d0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
a0e0: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
a0f0: 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20  **ppPage     /* 
a100: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
a110: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29  ointer here */.)
a120: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
a130: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
a140: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a150: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
a160: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
a170: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
a180: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a190: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
a1a0: 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f 66 74  ..  /* It is oft
a1b0: 65 6e 20 74 68 65 20 63 61 73 65 20 74 68 61 74  en the case that
a1c0: 20 74 68 65 20 70 61 67 65 20 77 65 20 77 61 6e   the page we wan
a1d0: 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
a1e0: 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73  cache..  ** If s
a1f0: 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65 63 74  o, get it direct
a200: 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65 73 20  ly.  This saves 
a210: 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74  us from having t
a220: 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65  o call.  ** page
a230: 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74 6f 20  rPagecount() to 
a240: 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f 20 69  make sure pgno i
a250: 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c  s within limits,
a260: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 0a 20   which results. 
a270: 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75 72 65   ** in a measure
a280: 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  able performance
a290: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20   improvements.. 
a2a0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   */.  *ppPage = 
a2b0: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
a2c0: 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 70 67 6e  eLookup(pBt, pgn
a2d0: 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 20  o);.  if( pPage 
a2e0: 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 69  ){.    /* Page i
a2f0: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
a300: 68 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  he */.    rc = S
a310: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
a320: 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  e{.    /* Page n
a330: 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20 41 63  ot in cache.  Ac
a340: 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20  quire it. */.   
a350: 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50   if( pgno>pagerP
a360: 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
a370: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
a380: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a390: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  T; .    }.    rc
a3a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
a3b0: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
a3c0: 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
a3d0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a3e0: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20  n rc;.    pPage 
a3f0: 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20  = *ppPage;.  }. 
a400: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
a410: 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nit ){.    rc = 
a420: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
a430: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
a440: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a450: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
a460: 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
a470: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
a480: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
a4a0: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
a4b0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
a4c0: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
a4d0: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
a4e0: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
a4f0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
a500: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
a510: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
a520: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
a530: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a540: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
a550: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
a560: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
a570: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3e  pPage->pDbPage)>
a580: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
a590: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
a5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
a5b0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
a5c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
a5d0: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
a5e0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
a5f0: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
a600: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a610: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
a620: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
a630: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
a640: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a650: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a660: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
a670: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
a680: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
a690: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
a6a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
a6b0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
a6c0: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
a6d0: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
a6e0: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
a6f0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
a700: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
a710: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
a720: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
a730: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
a740: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
a750: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
a760: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a770: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
a780: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
a790: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
a7a0: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
a7b0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
a7c0: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
a7d0: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
a7e0: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
a7f0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
a800: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
a810: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
a820: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
a830: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
a840: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
a850: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
a860: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
a870: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
a880: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
a890: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
a8a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a8b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a8c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
a8d0: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
a8e0: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
a8f0: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
a900: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
a910: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
a920: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
a930: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
a940: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
a950: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
a960: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
a970: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
a980: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
a990: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
a9a0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
a9b0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a9c0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
a9d0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
a9e0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a9f0: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
aa00: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
aa10: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
aa20: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
aa30: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
aa40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
aa50: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
aa60: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
aa70: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
aa80: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
aa90: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
aaa0: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
aab0: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
aac0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
aad0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
aae0: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
aaf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
ab00: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
ab10: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
ab20: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
ab30: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
ab40: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
ab50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
ab60: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
ab70: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
ab80: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
ab90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
aba0: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
abb0: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
abc0: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
abd0: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
abe0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
abf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
ac00: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
ac10: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
ac20: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
ac30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ac40: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
ac50: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e  e is NULL.** a n
ac60: 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ew database with
ac70: 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69   a random name i
ac80: 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73  s created.  This
ac90: 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a   randomly named.
aca0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
acb0: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
acc0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
acd0: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
ace0: 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  led..** If zFile
acf0: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
ad00: 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
ad10: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
ad20: 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
ad30: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
ad40: 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
ad50: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
ad60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
ad70: 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  eeOpen(.  const 
ad80: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
ad90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
ada0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
adb0: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
adc0: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
add0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
ade0: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
adf0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
ae00: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
ae10: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
ae20: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
ae30: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
ae40: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
ae50: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
ae60: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
ae70: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
ae80: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
ae90: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
aea0: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
aeb0: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
aec0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
aed0: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
aee0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f     /* The VFS to
aef0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 74   use for this bt
af00: 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ree */.  BtShare
af10: 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
af20: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
af30: 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
af40: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
af50: 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af70: 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
af80: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
af90: 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
afa0: 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
afb0: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
afc0: 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
afd0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
afe0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
aff0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
b000: 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
b010: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
b020: 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
b030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
b040: 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
b050: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
b060: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b070: 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
b080: 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
b090: 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
b0a0: 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  /..  /* Set the 
b0b0: 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62  variable isMemdb
b0c0: 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20   to true for an 
b0d0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
b0e0: 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c  se, or .  ** fal
b0f0: 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61  se for a file-ba
b100: 73 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68  sed database. Th
b110: 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c  is symbol is onl
b120: 79 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20  y required if.  
b130: 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ** either of the
b140: 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20   shared-data or 
b150: 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75  autovacuum featu
b160: 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64  res are compiled
b170: 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20   .  ** into the 
b180: 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69  library..  */.#i
b190: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b1a0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
b1b0: 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  CHE) || !defined
b1c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54  (SQLITE_OMIT_AUT
b1d0: 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65  OVACUUM).  #ifde
b1e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
b1f0: 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74  MORYDB.    const
b200: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
b210: 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f  ;.  #else.    co
b220: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
b230: 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  = zFilename && !
b240: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
b250: 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20  , ":memory:");. 
b260: 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a   #endif.#endif..
b270: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b290: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b2a0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
b2b0: 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73   pVfs = db->pVfs
b2c0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  ;.  p = sqlite3M
b2d0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
b2e0: 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
b2f0: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
b300: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
b310: 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
b320: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
b330: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66  p->db = db;..#if
b340: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b350: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
b360: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
b370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
b380: 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
b390: 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
b3a0: 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
b3b0: 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
b3c0: 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
b3d0: 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
b3e0: 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
b3f0: 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
b400: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65  .  */.  if( isMe
b410: 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e  mdb==0 && zFilen
b420: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
b430: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73  [0] ){.    if( s
b440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
b450: 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
b460: 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69  abled ){.      i
b470: 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  nt nFullPathname
b480: 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
b490: 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61  ame+1;.      cha
b4a0: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
b4b0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
b4c0: 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (nFullPathname);
b4d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
b4e0: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
b4f0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  d;.      p->shar
b500: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
b510: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
b520: 49 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b  ITE_SharedCache;
b530: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
b540: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
b550: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
b560: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
b570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b580: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
b590: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
b5a0: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
b5b0: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
b5c0: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
b5d0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
b5e0: 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
b5f0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
b600: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
b610: 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
b620: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
b630: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
b640: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
b650: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
b660: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
b670: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
b680: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
b690: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
b6a0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ared);.      for
b6b0: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
b6c0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
b6d0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
b6e0: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
b6f0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
b700: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
b710: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b720: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
b730: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
b740: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
b750: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
b760: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
b770: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
b780: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
b790: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
b7a0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
b7b0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
b7c0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
b7d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
b7e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
b7f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
b800: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
b810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
b820: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
b830: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
b840: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
b850: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
b860: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
b870: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
b880: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
b890: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
b8a0: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
b8b0: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
b8c0: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
b8d0: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
b8e0: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
b8f0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
b900: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
b910: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b920: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
b930: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
b940: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
b950: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b960: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
b970: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b980: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
b990: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
b9a0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
b9b0: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
b9c0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
b9d0: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
b9e0: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
b9f0: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
ba00: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
ba10: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
ba20: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
ba30: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
ba40: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
ba50: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
ba60: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
ba70: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
ba80: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
ba90: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
baa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
bab0: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
bac0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
bad0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
bae0: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
baf0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
bb00: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
bb10: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
bb20: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
bb30: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
bb40: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
bb50: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
bb60: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
bb70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
bb80: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
bb90: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
bba0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
bbb0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
bbc0: 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
bbd0: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
bbe0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
bc00: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
bc10: 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  fsFlags);.    if
bc20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bc30: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
bc40: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
bc50: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
bc60: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
bc70: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
bc80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
bc90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bca0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
bcb0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
bcc0: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d   }.    pBt->db =
bcd0: 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
bce0: 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
bcf0: 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
bd00: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
bd10: 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
bd20: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
bd30: 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50  .  .    sqlite3P
bd40: 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
bd50: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
bd60: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42  eReinit);.    pB
bd70: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
bd80: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
bd90: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65  = 0;.    pBt->re
bda0: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
bdb0: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
bdc0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
bdd0: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
bde0: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
bdf0: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20  eader[16]);.    
be00: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
be10: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
be20: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
be30: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
be40: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
be50: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
be60: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
be70: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
be80: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ize = 0;.      s
be90: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
bea0: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
beb0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
bec0: 7a 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ze);.#ifndef SQL
bed0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
bee0: 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
bef0: 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
bf00: 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
bf10: 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
bf20: 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
bf30: 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
bf40: 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
bf50: 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
bf60: 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
bf70: 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
bf80: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
bf90: 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
bfa0: 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
bfb0: 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
bfc0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
bfd0: 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
bfe0: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
bff0: 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
c000: 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
c010: 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
c020: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
c030: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
c040: 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
c050: 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
c060: 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
c070: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
c080: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
c090: 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
c0a0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
c0b0: 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
c0c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
c0d0: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
c0e0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
c0f0: 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
c100: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
c110: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
c120: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
c130: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
c140: 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
c150: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
c160: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
c170: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c180: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
c190: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
c1a0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
c1b0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
c1c0: 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
c1d0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
c1e0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
c1f0: 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
c200: 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
c210: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73     }.    pBt->us
c220: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
c230: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
c240: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
c250: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
c260: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
c270: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
c280: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
c290: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
c2a0: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
c2b0: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
c2c0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66  geSize);.   .#if
c2d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c2e0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
c2f0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
c300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
c310: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
c320: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
c330: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
c340: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
c350: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
c360: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
c370: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
c380: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
c390: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
c3a0: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
c3b0: 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  1;.      mutexSh
c3c0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
c3d0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
c3e0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
c3f0: 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TER);.      if( 
c400: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
c410: 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
c420: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
c430: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
c440: 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
c450: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
c460: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
c470: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
c480: 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
c490: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
c4a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
c4b0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
c4c0: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
c4d0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
c4e0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
c4f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c500: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
c510: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
c520: 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
c530: 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
c540: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
c550: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
c560: 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
c570: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
c580: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
c590: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
c5a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
c5b0: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
c5c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
c5d0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
c5e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
c5f0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
c600: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c610: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
c620: 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
c630: 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
c640: 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
c650: 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
c660: 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
c670: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
c680: 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
c690: 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
c6a0: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
c6b0: 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
c6c0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
c6d0: 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
c6e0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
c6f0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
c700: 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
c710: 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
c720: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
c730: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
c740: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
c750: 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
c760: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
c770: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
c780: 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
c790: 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
c7a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
c7b0: 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
c7c0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
c7d0: 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
c7e0: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
c7f0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
c800: 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
c810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c820: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
c830: 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
c840: 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
c850: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
c860: 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
c870: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
c880: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
c890: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
c8a0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
c8b0: 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
c8c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
c8d0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
c8e0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
c8f0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
c900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c910: 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
c920: 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
c930: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c940: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
c950: 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
c960: 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
c970: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
c980: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c990: 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
c9a0: 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
c9b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
c9c0: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
c9d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c9e0: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
c9f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ca00: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
ca10: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  = 0;.  }.  if( m
ca20: 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
ca30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ca40: 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
ca50: 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
ca60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ca70: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
ca80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ca90: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
caa0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
cab0: 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
cac0: 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
cad0: 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
cae0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
caf0: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
cb00: 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
cb10: 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
cb20: 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
cb30: 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
cb40: 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
cb50: 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
cb60: 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
cb70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cb80: 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
cb90: 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
cba0: 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
cbb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
cbc0: 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33  _CACHE.  sqlite3
cbd0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
cbe0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
cbf0: 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
cc00: 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
cc10: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
cc20: 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
cc30: 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72  ex) );.  pMaster
cc40: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
cc50: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
cc60: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
cc70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
cc80: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
cc90: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
cca0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
ccb0: 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
ccc0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
ccd0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
cce0: 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
ccf0: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
cd00: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
cd10: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
cd20: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
cd30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
cd40: 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
cd50: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
cd60: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
cd70: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
cd80: 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
cd90: 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
cda0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
cdb0: 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
cdc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
cdd0: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
cde0: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
cdf0: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
ce00: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
ce10: 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
ce20: 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
ce30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ce40: 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
ce50: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
ce60: 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
ce70: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ce80: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
ce90: 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
cea0: 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
ceb0: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
cec0: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
ced0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
cee0: 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
cef0: 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
cf00: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
cf10: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
cf20: 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
cf30: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
cf40: 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
cf50: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
cf60: 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
cf70: 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
cf80: 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
cf90: 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  eSize );.  }.}..
cfa0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
cfb0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
cfc0: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
cfd0: 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
cfe0: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
cff0: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
d000: 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
d010: 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
d020: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
d030: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
d040: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
d050: 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
d060: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
d070: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
d080: 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
d090: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
d0a0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
d0b0: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
d0c0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
d0d0: 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
d0e0: 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
d0f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d100: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
d110: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
d120: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
d130: 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
d140: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
d150: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
d160: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
d170: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
d180: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
d190: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
d1a0: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
d1b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
d1c0: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
d1d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d1e0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
d1f0: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
d200: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
d210: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
d220: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
d230: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
d240: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
d250: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
d260: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
d270: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
d280: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
d290: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
d2a0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
d2b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
d2c0: 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
d2d0: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
d2e0: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
d2f0: 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
d300: 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
d310: 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
d320: 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
d330: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
d340: 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
d350: 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
d360: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
d370: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
d380: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
d390: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
d3a0: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
d3b0: 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
d3c0: 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
d3d0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
d3e0: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
d3f0: 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
d400: 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
d410: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
d420: 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
d430: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
d440: 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
d450: 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
d460: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
d470: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
d480: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
d490: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
d4a0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
d4b0: 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
d4c0: 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
d4d0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
d4e0: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
d4f0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
d500: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d510: 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65  _free(pBt->pSche
d520: 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
d530: 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
d540: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
d550: 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
d560: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
d570: 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
d580: 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
d590: 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
d5a0: 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
d5b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
d5c0: 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
d5d0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
d5e0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
d5f0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
d600: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
d610: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
d620: 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
d630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d640: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
d650: 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
d660: 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
d670: 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
d680: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
d690: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
d6a0: 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
d6b0: 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
d6c0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
d6d0: 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
d6e0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
d6f0: 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
d700: 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
d710: 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
d720: 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
d730: 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
d740: 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
d750: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
d760: 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
d770: 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
d780: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
d790: 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
d7a0: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
d7b0: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
d7c0: 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
d7d0: 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
d7e0: 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
d7f0: 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
d800: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
d810: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
d820: 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
d830: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
d840: 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
d850: 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
d860: 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
d870: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
d880: 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
d890: 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
d8a0: 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
d8b0: 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
d8c0: 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
d8d0: 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
d8e0: 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
d8f0: 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
d900: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
d910: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
d920: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
d930: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
d940: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
d950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d960: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
d970: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
d980: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
d990: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
d9a0: 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
d9b0: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
d9c0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
d9d0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
d9e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d9f0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
da00: 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
da10: 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
da20: 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
da30: 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
da40: 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
da50: 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
da60: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
da70: 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
da80: 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
da90: 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
daa0: 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
dab0: 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
dac0: 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
dad0: 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
dae0: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
daf0: 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
db00: 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
db10: 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
db20: 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
db30: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
db40: 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
db50: 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
db60: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
db70: 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
db80: 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
db90: 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
dba0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
dbb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
dbc0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
dbd0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
dbe0: 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65  afetyLevel(Btree
dbf0: 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20   *p, int level, 
dc00: 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20  int fullSync){. 
dc10: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
dc20: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
dc30: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dc40: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
dc50: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
dc60: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
dc70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
dc80: 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d  SafetyLevel(pBt-
dc90: 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20  >pPager, level, 
dca0: 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
dcb0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
dcc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dcd0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
dce0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
dcf0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
dd00: 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
dd10: 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
dd20: 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
dd30: 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
dd40: 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
dd50: 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
dd60: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
dd70: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
dd80: 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
dd90: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
dda0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
ddb0: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
ddc0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ddd0: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
dde0: 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
ddf0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
de00: 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
de10: 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
de20: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
de30: 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
de40: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
de50: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
de60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
de70: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
de80: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
de90: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
dea0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
deb0: 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  CUUM)./*.** Chan
dec0: 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
ded0: 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
dee0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
def0: 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
df00: 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
df10: 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
df20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
df30: 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
df40: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
df50: 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
df60: 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
df70: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
df80: 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
df90: 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
dfa0: 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
dfb0: 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
dfc0: 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
dfd0: 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
dfe0: 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
dff0: 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
e000: 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
e010: 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
e020: 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
e030: 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
e040: 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
e050: 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
e060: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
e070: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
e080: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
e090: 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
e0a0: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
e0b0: 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
e0c0: 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
e0d0: 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
e0e0: 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
e0f0: 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
e100: 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
e110: 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
e120: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
e130: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
e140: 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
e150: 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
e160: 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
e170: 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
e180: 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
e190: 53 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69  SizeFixed flag i
e1a0: 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
e1b0: 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
e1c0: 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
e1d0: 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
e1e0: 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
e1f0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e200: 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
e210: 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
e220: 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
e230: 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
e240: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e250: 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
e260: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
e270: 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
e280: 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
e290: 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
e2a0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
e2b0: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
e2c0: 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20  izeFixed ){.    
e2d0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
e2e0: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
e2f0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
e300: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
e310: 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
e320: 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
e330: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
e340: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
e350: 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
e360: 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
e370: 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
e380: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
e390: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
e3a0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
e3b0: 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
e3c0: 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
e3d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
e3e0: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
e3f0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
e400: 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
e410: 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
e420: 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
e430: 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
e440: 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
e450: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
e460: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e470: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
e480: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
e490: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
e4a0: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
e4b0: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
e4c0: 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
e4d0: 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
e4e0: 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ) pBt->pageSize
e4f0: 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c  Fixed = 1;.  sql
e500: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
e510: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e520: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
e530: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
e540: 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
e550: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
e560: 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
e570: 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
e580: 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
e590: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
e5a0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
e5b0: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
e5c0: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
e5d0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
e5e0: 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
e5f0: 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
e600: 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
e610: 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
e620: 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
e630: 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
e640: 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sions..*/.int sq
e650: 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
e660: 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
e670: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
e680: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
e690: 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
e6a0: 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
e6b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
e6c0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
e6d0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
e6e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
e6f0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
e700: 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
e710: 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
e720: 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
e730: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
e740: 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
e750: 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
e760: 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
e770: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
e780: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
e790: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
e7a0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
e7b0: 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
e7c0: 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
e7d0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
e7e0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
e7f0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
e800: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
e810: 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
e820: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
e830: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
e840: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
e850: 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66  turn n;.}.#endif
e860: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
e870: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
e880: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
e890: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e8a0: 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
e8b0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
e8c0: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
e8d0: 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
e8e0: 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
e8f0: 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
e900: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
e910: 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
e920: 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
e930: 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
e940: 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
e950: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
e960: 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
e970: 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
e980: 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
e990: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
e9a0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
e9b0: 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
e9c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
e9d0: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
e9e0: 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
e9f0: 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
ea00: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
ea10: 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
ea20: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
ea30: 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
ea40: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
ea50: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ea60: 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
ea70: 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
ea80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ea90: 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
eaa0: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
eab0: 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
eac0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
ead0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
eae0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
eaf0: 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
eb00: 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
eb10: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
eb20: 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
eb30: 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
eb40: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
eb50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
eb60: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
eb70: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
eb80: 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
eb90: 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
eba0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
ebb0: 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
ebc0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
ebd0: 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
ebe0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
ebf0: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
ec00: 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
ec10: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ec20: 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
ec30: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
ec40: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
ec50: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
ec60: 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
ec70: 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
ec80: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
ec90: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
eca0: 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
ecb0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
ecc0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
ecd0: 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
ece0: 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
ecf0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
ed00: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
ed10: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
ed20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
ed30: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
ed40: 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
ed50: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
ed60: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
ed70: 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
ed80: 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
ed90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
eda0: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
edb0: 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
edc0: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
edd0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
ede0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
edf0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
ee00: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
ee10: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
ee20: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
ee30: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
ee40: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
ee50: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
ee60: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
ee70: 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
ee80: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
ee90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
eea0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
eeb0: 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
eec0: 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
eed0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
eee0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
eef0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
ef00: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
ef10: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ef20: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
ef30: 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
ef40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ef50: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
ef60: 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
ef70: 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
ef80: 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
ef90: 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
efa0: 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
efb0: 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
efc0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
efd0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
efe0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
eff0: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
f000: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f010: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
f020: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
f030: 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65   }else if( nPage
f040: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61  >0 ){.    int pa
f050: 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  geSize;.    int 
f060: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
f070: 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
f080: 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
f090: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
f0a0: 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
f0b0: 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
f0c0: 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
f0d0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
f0e0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
f0f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
f100: 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
f110: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
f120: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
f130: 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
f140: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
f150: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
f160: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
f170: 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
f180: 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
f190: 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
f1a0: 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
f1b0: 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
f1c0: 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
f1d0: 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
f1e0: 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
f1f0: 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
f200: 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
f210: 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
f220: 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
f230: 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
f240: 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
f250: 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
f260: 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
f270: 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
f280: 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
f290: 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
f2a0: 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
f2b0: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
f2c0: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
f2d0: 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
f2e0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67   = get2byte(&pag
f2f0: 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  e1[16]);.    if(
f300: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
f310: 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70  ageSize)!=0 || p
f320: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20  ageSize<512 ||. 
f330: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d         (SQLITE_M
f340: 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37  AX_PAGE_SIZE<327
f350: 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53  68 && pageSize>S
f360: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
f370: 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  IZE).    ){.    
f380: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
f390: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
f3a0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
f3b0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
f3c0: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
f3d0: 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
f3e0: 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
f3f0: 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
f400: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
f410: 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
f420: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
f430: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
f440: 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
f450: 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
f460: 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
f470: 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
f480: 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
f490: 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
f4a0: 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
f4b0: 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
f4c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
f4d0: 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
f4e0: 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
f4f0: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
f500: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
f510: 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
f520: 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
f530: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
f540: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
f550: 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
f560: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
f570: 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
f580: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
f590: 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a  = (u16)usableSiz
f5a0: 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
f5b0: 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
f5c0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
f5d0: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
f5e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
f5f0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
f600: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
f610: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
f620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f630: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
f640: 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35  if( usableSize<5
f650: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
f660: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
f670: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
f680: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
f690: 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  16)pageSize;.   
f6a0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
f6b0: 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69   = (u16)usableSi
f6c0: 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
f6d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f6e0: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
f6f0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
f700: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
f710: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
f720: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
f730: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
f740: 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
f750: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
f760: 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
f770: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
f780: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
f790: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
f7a0: 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
f7b0: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
f7c0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
f7d0: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
f7e0: 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
f7f0: 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
f800: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
f810: 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
f820: 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
f830: 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
f840: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
f850: 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
f860: 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
f870: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
f880: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
f890: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
f8a0: 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
f8b0: 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
f8c0: 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
f8d0: 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
f8e0: 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
f8f0: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
f900: 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
f910: 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
f920: 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
f930: 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
f940: 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
f950: 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
f960: 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
f970: 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
f980: 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
f990: 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
f9a0: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
f9b0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
f9c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
f9d0: 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*64/255 - 23;.
f9e0: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
f9f0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
fa00: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
fa10: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
fa20: 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
fa30: 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
fa40: 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
fa50: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
fa60: 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
fa70: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
fa80: 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
fa90: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
faa0: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
fab0: 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
fac0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
fad0: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
fae0: 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
faf0: 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
fb00: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
fb10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
fb20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
fb30: 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74  orks like lockBt
fb40: 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61  ree() except tha
fb50: 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65  t it also invoke
fb60: 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61  s the.** busy ca
fb70: 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20  llback if there 
fb80: 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  is lock contenti
fb90: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
fba0: 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  t lockBtreeWithR
fbb0: 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66  etry(Btree *pRef
fbc0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
fbd0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
fbe0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
fbf0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29  HoldsMutex(pRef)
fc00: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e   );.  if( pRef->
fc10: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
fc20: 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e  ONE ){.    u8 in
fc30: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52  Transaction = pR
fc40: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
fc50: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65  action;.    btre
fc60: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
fc70: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
fc80: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
fc90: 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20  s(pRef, 0);.    
fca0: 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
fcb0: 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61  nsaction = inTra
fcc0: 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52  nsaction;.    pR
fcd0: 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52  ef->inTrans = TR
fce0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66  ANS_NONE;.    if
fcf0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fd00: 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70  ){.      pRef->p
fd10: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
fd20: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74  --;.    }.    bt
fd30: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
fd40: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
fd50: 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a   rc;.}.       ..
fd60: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
fd70: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
fd80: 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
fd90: 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
fda0: 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
fdb0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
fdc0: 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
fdd0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
fde0: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
fdf0: 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
fe00: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
fe10: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fe20: 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
fe30: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
fe40: 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
fe50: 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
fe60: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
fe70: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
fe80: 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  sors, this routi
fe90: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
fea0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
feb0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
fec0: 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
fed0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
fee0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
fef0: 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
ff00: 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
ff10: 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
ff20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ff30: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
ff40: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
ff50: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
ff60: 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
ff70: 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70  >pCursor==0 && p
ff80: 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
ff90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
ffa0: 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
ffb0: 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b  t->pPager)>=1 ){
ffc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ffd0: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
ffe0: 61 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  a );.      relea
fff0: 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67  sePage(pBt->pPag
10000 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  e1);.    }.    p
10010 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
10020 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
10030 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ate a new databa
10040 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
10050 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
10060 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
10070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10080 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
10090 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
100a0 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
100b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
100c0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  a;.  int rc;.  i
100d0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
100e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
100f0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
10100 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
10110 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
10120 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
10130 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
10140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
10150 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
10160 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10170 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
10180 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
10190 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
101a0 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
101b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
101c0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
101d0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
101e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
101f0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
10200 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
10210 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
10220 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
10230 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
10240 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
10250 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
10260 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
10270 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
10280 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
10290 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
102a0 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
102b0 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
102c0 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
102d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
102e0 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
102f0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
10300 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
10310 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
10320 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
10330 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
10340 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
10350 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
10360 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
10370 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
10380 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
10390 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
103a0 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
103b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
103c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
103d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
103e0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
103f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
10400 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10410 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
10420 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
10430 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
10440 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
10450 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
10460 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
10470 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
10480 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
10490 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
104a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
104b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
104c0 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
104d0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
104e0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
104f0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
10500 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
10510 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
10520 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
10530 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
10540 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
10550 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
10560 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
10570 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
10580 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
10590 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
105a0 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
105b0 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
105c0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
105d0 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
105e0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
105f0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
10600 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
10610 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
10620 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
10630 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
10640 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
10650 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
10660 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
10670 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
10680 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
10690 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
106a0 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
106b0 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
106c0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
106d0 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
106e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
106f0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
10700 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
10710 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
10720 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
10730 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
10740 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
10750 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
10760 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
10770 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
10780 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
10790 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
107a0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
107b0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
107c0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
107d0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
107e0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
107f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10800 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
10810 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
10820 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
10830 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
10840 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
10850 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
10860 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
10870 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
10880 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
10890 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
108a0 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
108b0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
108c0 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
108d0 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
108e0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
108f0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
10900 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
10910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
10920 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
10930 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
10940 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
10950 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
10960 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
10970 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
10980 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
10990 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
109a0 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
109b0 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
109c0 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
109d0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
109e0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
109f0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
10a00 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
10a10 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
10a20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
10a30 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
10a40 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
10a50 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
10a60 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
10a70 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
10a80 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
10a90 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
10aa0 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
10ab0 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
10ac0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
10ad0 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
10ae0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
10af0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
10b00 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
10b10 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
10b20 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
10b30 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
10b40 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
10b50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
10b60 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
10b70 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
10b80 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
10b90 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
10ba0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10bb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10bc0 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
10bd0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
10be0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
10bf0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
10c00 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
10c10 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
10c20 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
10c30 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
10c40 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
10c50 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
10c60 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
10c70 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
10c80 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
10c90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
10ca0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
10cb0 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
10cc0 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
10cd0 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
10ce0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
10cf0 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  gun;.  }..  /* W
10d00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
10d10 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
10d20 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
10d30 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
10d40 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
10d50 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  y && wrflag ){. 
10d60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
10d70 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
10d80 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
10d90 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
10da0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10db0 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
10dc0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
10dd0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
10de0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
10df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
10e00 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
10e10 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
10e20 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
10e30 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
10e40 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
10e50 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
10e60 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
10e70 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
10e80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10e90 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  n==TRANS_WRITE) 
10ea0 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e  || pBt->isPendin
10eb0 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20  g ){.    pBlock 
10ec0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
10ed0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
10ee0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
10ef0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
10f00 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
10f10 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
10f20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
10f30 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
10f40 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
10f50 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
10f60 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
10f70 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
10f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
10f90 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
10fa0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
10fb0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
10fc0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
10fd0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
10fe0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
10ff0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
11000 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
11010 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20   }.#endif..  do 
11020 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
11030 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
11040 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
11050 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
11060 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
11070 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
11080 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
11090 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
110a0 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
110b0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
110c0 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
110d0 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
110e0 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
110f0 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
11100 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
11110 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
11120 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
11130 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
11140 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
11150 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
11160 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
11170 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
11180 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
11190 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
111a0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
111b0 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
111c0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
111d0 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
111e0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
111f0 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
11200 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11210 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
11220 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  ){.      if( pBt
11230 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
11240 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11250 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
11260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11280 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
11290 67 65 72 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a  ger, wrflag>1);.
112a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
112b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
112c0 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
112d0 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
112e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
112f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
11300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11310 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
11320 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
11330 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
11340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
11350 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
11360 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
11370 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
11380 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
11390 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
113a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
113b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
113c0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
113d0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
113e0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
113f0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n++;.    }.    p
11400 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
11410 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
11420 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
11430 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
11440 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
11450 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
11460 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
11470 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
11480 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
11490 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
114a0 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c  CHE.    if( wrfl
114b0 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ag ){.      asse
114c0 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
114d0 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
114e0 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
114f0 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73     pBt->isExclus
11500 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61  ive = (u8)(wrfla
11510 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  g>1);.    }.#end
11520 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62  if.  }...trans_b
11530 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
11540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
11550 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
11560 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
11570 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
11580 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
11590 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
115a0 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
115b0 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
115c0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
115d0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
115e0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
115f0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
11600 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
11610 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
11620 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
11630 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
11640 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
11650 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
11660 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
11670 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
11680 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
11690 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
116a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
116b0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
116c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
116d0 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
116e0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
116f0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
11700 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
11710 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
11720 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
11730 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
11740 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
11750 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
11760 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
11770 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
11780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
11790 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
117a0 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
117b0 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
117c0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
117f0 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
11800 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11830 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
11840 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
11850 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
11880 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
11890 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
118a0 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
118b0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
118c0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
118d0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
118e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
118f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
11900 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
11910 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
11920 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
11930 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
11940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11950 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
11960 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a  trmaps_out;.  }.
11970 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
11980 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
11990 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
119a0 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
119b0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
119c0 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d  e, i);..    rc =
119d0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
119e0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
119f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11a10 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
11a20 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
11a30 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
11a40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
11a50 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
11a60 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
11a70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
11a80 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
11a90 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
11aa0 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  TREE, pgno);.   
11ab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11ac0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f  E_OK ) goto set_
11ad0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
11ae0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
11af0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
11b00 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
11b10 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
11b20 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
11b30 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
11b40 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  +8]);.    rc = p
11b50 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
11b60 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
11b70 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
11b80 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
11b90 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
11ba0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
11bb0 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
11bc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
11bd0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
11be0 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72 61  , which is guara
11bf0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62 74  nteed to be a bt
11c00 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e  ree page, not an
11c10 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
11c20 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
11c30 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d  to page iFrom. M
11c40 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
11c50 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  er so that it po
11c60 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20  ints to.** iTo. 
11c70 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
11c80 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
11c90 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
11ca0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
11cb0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   .** follows:.**
11cc0 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
11cd0 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
11ce0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
11cf0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
11d00 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
11d30 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
11d40 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
11d50 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
11d60 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
11d70 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
11d80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11d90 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
11da0 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
11db0 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
11dc0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
11dd0 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
11de0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
11df0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
11e00 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
11e10 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
11e20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
11e30 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
11e40 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
11e50 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
11e60 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
11e70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
11e80 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
11e90 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
11ea0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11eb0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
11ec0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11ed0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11ee0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
11ef0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
11f00 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
11f10 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
11f20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
11f30 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
11f40 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
11f50 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
11f60 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
11f70 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
11f80 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
11f90 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
11fa0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11fb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
11fc0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
11fd0 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
11fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69   }else{.    u8 i
11ff0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
12000 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
12010 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
12020 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ell;..    sqlite
12030 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
12040 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  Page);.    nCell
12050 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
12060 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
12070 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
12080 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
12090 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
120a0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
120b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
120c0 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
120d0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
120e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
120f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
12100 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
12110 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
12120 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
12130 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
12140 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
12150 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
12160 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20  Overflow]) ){.  
12170 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
12180 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
12190 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
121a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
121b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
121c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
121d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
121e0 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
121f0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
12200 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
12210 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
12220 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12240 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
12250 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
12260 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
12270 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
12280 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
12290 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
122a0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
122b0 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
122c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
122d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
122e0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
122f0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
12300 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
12310 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
12320 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
12330 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
12340 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
12350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12360 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
12370 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
12380 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
12390 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
123a0 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
123b0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
123c0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
123d0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
123e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
123f0 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
12400 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
12410 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
12420 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
12430 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
12440 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
12450 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
12460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12470 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
12480 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
12490 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
124a0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
124b0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
124c0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
124d0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
124e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
124f0 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
12500 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
12510 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
12520 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
12530 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  mmit.){.  MemPag
12540 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
12550 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
12560 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
12570 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
12580 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
12590 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
125a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
125b0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
125c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
125d0 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
125e0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
125f0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
12600 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
12610 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
12620 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
12630 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
12640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12650 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12660 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12670 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
12680 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
12690 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
126a0 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
126b0 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
126c0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
126d0 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
126e0 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
126f0 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
12700 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
12710 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
12720 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
12730 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
12740 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
12750 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
12760 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
12770 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
12780 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
12790 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
127a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
127b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
127c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
127d0 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
127e0 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
127f0 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
12800 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
12810 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
12820 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
12830 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
12840 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
12850 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
12860 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
12870 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
12880 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
12890 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
128a0 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
128b0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
128c0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
128d0 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
128e0 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
128f0 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
12900 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
12910 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
12920 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
12930 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
12940 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
12950 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
12960 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
12970 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
12980 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
12990 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
129a0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
129b0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
129c0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
129d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
129e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
129f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
12a00 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
12a10 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
12a20 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
12a30 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
12a40 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
12a50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
12a60 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
12a70 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
12a80 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
12a90 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  eePage);.      i
12aa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
12ac0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
12ad0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
12ae0 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
12af0 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
12b00 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
12b10 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
12b20 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
12b30 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
12b40 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
12b50 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
12b60 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
12b70 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
12b80 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
12b90 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
12ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
12bb0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
12bc0 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
12bd0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
12be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12bf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
12c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
12c20 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
12c30 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
12c40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12c50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
12c60 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
12c70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12c80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
12c90 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
12ca0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
12cb0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
12cc0 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
12cd0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
12ce0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
12d00 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
12d10 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
12d20 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a  ype, iPtrPage);.
12d30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12d40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
12d50 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
12d60 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
12d70 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
12d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
12d90 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
12da0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
12db0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
12dc0 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
12dd0 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
12de0 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
12df0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
12e00 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
12e10 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
12e20 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
12e30 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
12e40 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
12e50 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c  .** point in cal
12e60 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
12e70 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
12e80 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  n SQLITE_DONE..*
12e90 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
12ea0 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
12eb0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
12ec0 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
12ed0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20  .** database so 
12ee0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
12ef0 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
12f00 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a  urrently in use.
12f10 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
12f20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in use..**.** If
12f30 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65   the nFin parame
12f40 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
12f50 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
12f60 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
12f70 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
12f80 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
12f90 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
12fa0 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
12fb0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
12fc0 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
12fd0 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
12fe0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
12ff0 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
13000 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
13010 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
13020 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
13030 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61  complete..*/.sta
13040 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
13050 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
13060 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
13070 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a   Pgno iLastPg){.
13080 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
13090 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
130a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
130b0 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
130c0 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
130d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
130e0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
130f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
13100 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
13110 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
13120 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
13130 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
13140 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
13150 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e  E(pBt) ){.    in
13160 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79  t rc;.    u8 eTy
13170 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
13180 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
13190 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
131a0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
131b0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
131c0 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
131d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
131e0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
131f0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
13200 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
13210 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
13220 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
13230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13240 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
13250 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
13260 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
13270 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
13280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13290 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
132a0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
132b0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
132c0 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
132d0 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
132e0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
132f0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
13300 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
13310 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
13320 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
13330 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
13340 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
13350 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
13360 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
13370 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
13380 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
13390 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
133a0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
133b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
133c0 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
133d0 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
133e0 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
133f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13400 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
13410 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
13420 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
13430 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
13440 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
13450 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
13460 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
13470 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
13480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13490 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
134a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
134b0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
134c0 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
134d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
134e0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
134f0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
13500 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
13510 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
13520 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
13530 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
13540 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
13550 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
13560 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
13570 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
13580 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
13590 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
135a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
135b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
135c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
135d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
135e0 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72  * If nFin is zer
135f0 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
13600 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
13610 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
13620 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
13630 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
13640 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
13650 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
13660 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
13670 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
13680 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e  other hand, if n
13690 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74  Fin is greater t
136a0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
136b0 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
136c0 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
136d0 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
136e0 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
136f0 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
13700 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
13710 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
13720 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  */.      do {.  
13730 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
13740 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
13750 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
13760 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
13770 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
13780 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
13790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
137a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
137b0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
137c0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
137d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
137e0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
137f0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
13800 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e  .      }while( n
13810 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50  Fin!=0 && iFreeP
13820 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
13830 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
13840 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
13850 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c   .      rc = sql
13860 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
13870 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29  LastPg->pDbPage)
13880 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
138a0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
138b0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
138c0 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
138d0 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e  Page, iFreePg, n
138e0 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d  Fin!=0);.      }
138f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13900 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
13910 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13940 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
13950 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
13960 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
13970 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67    while( iLastPg
13980 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
13990 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50  AGE(pBt)||PTRMAP
139a0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
139b0 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69  stPg) ){.      i
139c0 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
139d0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
139e0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
139f0 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20  e *pPg;.        
13a00 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
13a10 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
13a20 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c  , iLastPg, &pPg,
13a30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
13a40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13a50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
13a60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
13a70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13a80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
13a90 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
13aa0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
13ab0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ge(pPg);.       
13ac0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13ad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13ae0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13af0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13b00 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
13b10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
13b20 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
13b30 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  e(pBt->pPager, i
13b40 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72  LastPg);.  }.  r
13b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
13b70 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
13b80 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
13b90 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
13ba0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
13bb0 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
13bc0 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
13bd0 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
13be0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
13bf0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
13c00 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
13c10 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
13c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
13c30 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
13c40 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
13c50 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
13c60 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
13c70 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
13c80 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
13c90 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
13ca0 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
13cb0 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
13cc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13cd0 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
13ce0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
13cf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13d00 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
13d10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
13d30 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13d40 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
13d50 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
13d60 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
13d70 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
13d80 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
13d90 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
13da0 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  se{.    invalida
13db0 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
13dc0 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  he(pBt);.    rc 
13dd0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
13de0 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50 61  (pBt, 0, pagerPa
13df0 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20  gecount(pBt));. 
13e00 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
13e10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13e20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13e30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13e40 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
13e50 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
13e60 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
13e70 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
13e80 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
13e90 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
13ea0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
13eb0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
13ec0 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
13ed0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
13ee0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
13ef0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
13f00 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
13f10 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
13f20 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
13f30 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
13f40 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
13f50 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
13f60 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
13f70 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
13f80 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
13f90 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
13fa0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
13fb0 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
13fc0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
13fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
13fe0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
13ff0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
14000 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
14010 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
14020 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
14030 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
14040 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
14050 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14060 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
14070 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
14080 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
14090 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
140a0 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
140b0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
140c0 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Fin;.    Pgno nF
140d0 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  ree;.    Pgno nP
140e0 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f 20  trmap;.    Pgno 
140f0 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73 74  iFree;.    const
14100 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d   int pgsz = pBt-
14110 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 50  >pageSize;.    P
14120 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67 65  gno nOrig = page
14130 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
14140 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ..    if( PTRMAP
14150 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
14160 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45  ig) || nOrig==PE
14170 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
14180 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
14190 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
141a0 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
141b0 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69  database for whi
141c0 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67  ch the final pag
141d0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  e.      ** is ei
141e0 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d  ther a pointer-m
141f0 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70  ap page or the p
14200 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
14210 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a  . If one.      *
14220 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
14230 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
14240 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
14250 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
14260 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
14270 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
14280 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
14290 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
142a0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
142b0 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
142c0 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
142d0 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
142e0 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a  g)+pgsz/5)/(pgsz
142f0 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  /5);.    nFin = 
14300 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
14310 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28  nPtrmap;.    if(
14320 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
14330 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
14340 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
14350 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
14360 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
14370 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50    }.    while( P
14380 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
14390 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
143a0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
143b0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
143c0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 0a   nFin--;.    }..
143d0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
143e0 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
143f0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
14400 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
14410 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
14420 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
14430 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20   iFree);.    }. 
14440 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
14450 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
14460 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
14470 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
14480 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
144a0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
144b0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
144c0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
144d0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
144e0 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
144f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
14500 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
14510 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
14520 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
14530 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
14540 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20  Pager, nFin);.  
14550 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
14560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14570 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14580 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14590 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
145a0 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
145b0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
145c0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
145d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
145e0 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  if /* ifndef SQL
145f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
14600 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  UUM */../*.** Th
14610 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
14620 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
14630 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
14640 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
14650 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
14660 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
14670 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
14680 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
14690 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
146a0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
146b0 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
146c0 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
146d0 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
146e0 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
146f0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
14700 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
14710 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
14720 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
14730 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
14740 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
14750 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
14760 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
14770 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
14780 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
14790 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
147a0 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
147b0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
147c0 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
147d0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
147e0 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
147f0 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
14800 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
14810 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
14820 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
14830 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
14840 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
14850 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
14860 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
14870 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
14880 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
14890 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
148a0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
148b0 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
148c0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
148d0 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
148e0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
148f0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
14900 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
14910 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
14920 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
14930 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
14940 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
14950 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14960 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
14970 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
14980 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
14990 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
149a0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
149b0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
149c0 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
149d0 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
149e0 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
149f0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
14a00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
14a10 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
14a20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
14a30 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
14a40 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
14a50 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
14a60 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
14a70 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
14a80 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
14a90 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
14aa0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
14ab0 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
14ac0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
14ad0 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
14ae0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
14af0 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
14b00 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
14b10 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
14b20 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
14b30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
14b40 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
14b50 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
14b60 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
14b70 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
14b80 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
14b90 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
14ba0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14bb0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
14bc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
14bd0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
14be0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
14bf0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14c00 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
14c10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14c20 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
14c30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
14c40 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
14c50 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
14c60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14c70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14c80 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14c90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
14ca0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14cb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
14cc0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
14cd0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
14ce0 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
14cf0 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
14d00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
14d10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
14d20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14d30 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
14d40 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
14d50 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
14d60 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
14d70 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
14d80 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
14d90 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
14da0 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
14db0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
14dc0 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
14dd0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
14de0 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
14df0 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
14e00 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
14e10 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
14e20 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
14e30 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
14e40 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
14e50 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
14e60 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
14e70 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
14e80 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
14e90 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
14ea0 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
14eb0 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
14ec0 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
14ed0 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
14ee0 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
14ef0 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
14f00 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
14f10 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
14f20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
14f30 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
14f40 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
14f50 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
14f60 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
14f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
14f80 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
14f90 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
14fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14fb0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
14fc0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
14fd0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
14fe0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
14ff0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
15000 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
15010 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a  eTwo(Btree *p){.
15020 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15030 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
15040 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15050 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
15060 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
15070 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
15080 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
15090 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
150a0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
150b0 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
150c0 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
150d0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
150e0 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
150f0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
15100 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
15110 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
15120 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
15130 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
15140 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
15150 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
15160 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
15170 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15180 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
15190 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
151a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
151b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
151c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
151d0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
151e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
151f0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
15200 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
15210 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  AD;.  }..  /* If
15220 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
15230 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
15240 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
15250 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e  crement the tran
15260 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
15270 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
15280 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
15290 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
152a0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a   reaches 0, set.
152b0 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20    ** the shared 
152c0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
152d0 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
152e0 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63  treeIfUnused() c
152f0 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77  all below.  ** w
15300 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
15310 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ager..  */.  if(
15320 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
15330 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 63  NS_NONE ){.    c
15340 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
15350 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
15360 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
15370 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
15380 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
15390 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
153a0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
153b0 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
153c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
153d0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
153e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
153f0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
15400 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a   and unlock.  **
15410 20 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68   the pager if th
15420 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
15430 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
15440 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
15450 6e 2e 0a 20 20 2a 2f 0a 20 20 62 74 72 65 65 43  n..  */.  btreeC
15460 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
15470 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  Bt);.  p->inTran
15480 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
15490 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
154a0 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62  nused(pBt);..  b
154b0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
154c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
154d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
154e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
154f0 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
15500 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
15510 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
15520 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
15530 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
15540 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15550 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
15560 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15570 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
15580 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
15590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
155a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
155b0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29  ommitPhaseTwo(p)
155c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
155d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
155e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
155f0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
15600 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
15610 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
15620 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
15630 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
15640 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
15650 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
15660 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
15670 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
15680 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
15690 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
156a0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
156b0 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
156c0 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  e, a write-curso
156d0 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
156e0 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
156f0 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f  le of writing to
15700 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54   the databse.  T
15710 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75  hat means the cu
15720 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67  rsor was.** orig
15730 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  inally opened fo
15740 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68  r writing and th
15750 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
15760 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20   be disabled.** 
15770 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74  by having its st
15780 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43  ate changed to C
15790 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a  URSOR_FAULT..*/.
157a0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
157b0 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
157c0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
157d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
157e0 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
157f0 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
15800 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
15810 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
15820 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
15830 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ag && pCur->eSta
15840 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
15850 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
15860 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
15870 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
15880 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
15890 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
158a0 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
158b0 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
158c0 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
158d0 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
158e0 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
158f0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
15900 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
15910 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
15920 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
15930 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
15940 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
15950 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
15960 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
15970 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
15980 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
15990 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
159a0 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
159b0 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
159c0 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
159d0 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
159e0 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
159f0 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
15a00 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
15a10 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
15a20 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
15a30 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
15a40 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
15a50 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
15a60 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
15a70 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
15a80 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
15a90 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
15aa0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
15ab0 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
15ac0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
15ad0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
15ae0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
15af0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
15b00 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
15b10 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
15b20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
15b30 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15b40 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
15b50 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
15b60 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
15b70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
15b80 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
15b90 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
15ba0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
15bb0 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
15bc0 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d  T;.    p->skip =
15bd0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f   errCode;.    fo
15be0 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
15bf0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
15c00 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
15c10 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
15c20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
15c30 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
15c40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15c50 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
15c60 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
15c70 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
15c80 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
15c90 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
15ca0 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
15cb0 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
15cc0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
15cd0 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
15ce0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
15cf0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
15d00 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
15d10 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
15d20 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
15d30 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
15d40 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
15d50 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15d60 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
15d70 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
15d80 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
15d90 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
15da0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
15db0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
15dc0 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
15dd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
15de0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15df0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
15e00 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
15e10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15e20 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  );.  rc = saveAl
15e30 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
15e40 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
15e50 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15e60 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
15e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e80 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
15e90 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
15ea0 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
15eb0 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72  c() error occurr
15ec0 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a  ed whilst.    **
15ed0 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
15ee0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73  cursor positions
15ef0 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
15f00 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61  automatic rollba
15f10 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68  ck (as.    ** th
15f20 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f  e result of a co
15f30 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63  nstraint, malloc
15f40 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f  () failure or IO
15f50 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20   error) then .  
15f60 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d    ** the cache m
15f70 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ay be internally
15f80 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e   inconsistent (n
15f90 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64  ot contain valid
15fa0 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a   trees) so.    *
15fb0 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70  * we cannot simp
15fc0 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  ly return the er
15fd0 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ror to the calle
15fe0 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72  r. Instead, abor
15ff0 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75  t .    ** all qu
16000 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62  eries that may b
16010 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74  e using any of t
16020 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
16030 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a  failed to save..
16040 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
16050 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
16060 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20  rsors(p, rc);.  
16070 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
16080 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
16090 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
160a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
160b0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
160c0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
160d0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
160e0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
160f0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
16100 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
16110 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
16120 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
16130 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
16140 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
16150 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
16160 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
16170 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
16180 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
16190 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74     ** call sqlit
161a0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29  e3BtreeGetPage()
161b0 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
161c0 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
161d0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
161e0 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
161f0 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
16200 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16210 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
16220 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
16230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
16240 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
16250 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
16260 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
16270 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
16280 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
16290 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
162a0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  EAD;.  }..  if( 
162b0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
162c0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 63 6c  S_NONE ){.    cl
162d0 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
162e0 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
162f0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
16300 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
16310 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
16320 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
16330 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
16340 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
16350 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
16360 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
16370 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
16380 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
16390 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d 3e  tent(pBt);.  p->
163a0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
163b0 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  NONE;.  unlockBt
163c0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
163d0 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
163e0 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
163f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16400 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16410 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
16420 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
16430 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
16440 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63  ransaction can c
16450 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  an be rolled.** 
16460 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
16470 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
16480 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20  ransaction. You 
16490 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
164a0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66  nsaction .** bef
164b0 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
164c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
164d0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
164e0 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
164f0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20  atically .** if 
16500 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
16510 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20  tion commits or 
16520 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
16530 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
16540 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
16550 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
16560 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
16570 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
16580 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
16590 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
165a0 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
165b0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
165c0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
165d0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
165e0 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
165f0 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
16600 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
16610 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
16620 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
16630 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
16640 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
16650 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75  * A statement su
16660 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
16670 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
16680 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  an anonymous sav
16690 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76  epoint. The.** v
166a0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
166b0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
166c0 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ter is the total
166d0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
166e0 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64  oints,.** includ
166f0 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e  ing the new anon
16700 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c  ymous savepoint,
16710 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54   open on the B-T
16720 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  ree. i.e. if the
16730 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
16740 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
16750 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74  nd no other stat
16760 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
16770 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61  ns open,.** iSta
16780 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69  tement is 1. Thi
16790 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  s anonymous save
167a0 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c  point can be rel
167b0 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  eased or rolled 
167c0 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68  back.** using th
167d0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  e sqlite3BtreeSa
167e0 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69  vepoint() functi
167f0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
16800 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
16810 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
16820 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e  Statement){.  in
16830 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
16840 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16850 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16860 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
16870 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
16880 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
16890 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64  ssert( pBt->read
168a0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
168b0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
168c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
168d0 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
168e0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
168f0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 69 6e   if( NEVER(p->in
16900 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
16910 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f  TE || pBt->readO
16920 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  nly) ){.    rc =
16930 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
16940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
16950 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
16960 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
16970 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 2f 2a  _WRITE );.    /*
16980 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
16990 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
169a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
169b0 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
169c0 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  .    ** an index
169d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
169e0 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
169f0 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
16a00 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c  using.    ** SQL
16a10 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
16a20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
16a30 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
16a40 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20 20  ollback any.    
16a50 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
16a60 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
16a70 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
16a80 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
16a90 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  active..    */. 
16aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16ab0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
16ac0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
16ad0 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a  Statement);.  }.
16ae0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16af0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16b00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
16b10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
16b20 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
16b30 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
16b40 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
16b50 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
16b60 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
16b70 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
16b80 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
16b90 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
16ba0 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
16bb0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
16bc0 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
16bd0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
16be0 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
16bf0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
16c00 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
16c10 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
16c20 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
16c30 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
16c40 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
16c50 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
16c60 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
16c70 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
16c80 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
16c90 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
16ca0 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
16cb0 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
16cc0 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
16cd0 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
16ce0 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
16cf0 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
16d00 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
16d10 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
16d20 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
16d30 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
16d40 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
16d50 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
16d60 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
16d70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
16d80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
16d90 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
16da0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
16db0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
16dc0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16dd0 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
16de0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
16df0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
16e00 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
16e10 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
16e20 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
16e30 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
16e40 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
16e50 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
16e60 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16e70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
16e80 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
16e90 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
16ea0 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
16eb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16ec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16ed0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
16ee0 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pBt);.    }.    
16ef0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16f00 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
16f10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16f20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
16f30 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
16f40 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
16f50 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
16f60 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20  Table.  The act 
16f70 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61 20 63  of acquiring a c
16f80 75 72 73 6f 72 20 67 65 74 73 20 61 20 72 65 61  ursor gets a rea
16f90 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68  d lock on .** th
16fa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16fb0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
16fc0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
16fd0 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
16fe0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
16ff0 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
17000 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
17010 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
17020 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
17030 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
17040 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
17050 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
17060 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
17070 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
17080 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
17090 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
170a0 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
170b0 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
170c0 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
170d0 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
170e0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
170f0 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
17100 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
17110 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
17120 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
17130 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
17140 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
17150 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
17160 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
17170 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
17180 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
17190 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
171a0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
171b0 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
171c0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
171d0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
171e0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
171f0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
17200 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
17210 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
17220 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
17230 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
17240 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
17250 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
17260 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
17270 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
17280 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
17290 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
172a0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
172b0 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
172c0 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
172d0 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
172e0 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
172f0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
17300 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
17310 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
17320 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
17330 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
17340 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
17350 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
17360 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
17370 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
17380 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65 73 20  sorSize() bytes 
17390 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f  of memory .** po
173a0 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43 75 72  inted to by pCur
173b0 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72 6f 65   have been zeroe
173c0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
173d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
173e0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
173f0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
17420 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
17430 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17450 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
17460 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
17470 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17490 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
174a0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
174b0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
174c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
174d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
174e0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
174f0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
17500 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
17510 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17530 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
17540 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  cursor */.){.  i
17550 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 6e 50  nt rc;.  Pgno nP
17560 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
17570 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
17580 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17590 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
175a0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
175b0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
175c0 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
175d0 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61   wrFlag ){.    a
175e0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
175f0 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 69 66 28  dOnly );.    if(
17600 20 4e 45 56 45 52 28 70 42 74 2d 3e 72 65 61 64   NEVER(pBt->read
17610 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 72  Only) ){.      r
17620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
17630 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  DONLY;.    }.   
17640 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65   rc = checkForRe
17650 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
17660 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Table, 0, 0);.  
17670 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17680 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
17690 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
176a0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
176b0 48 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  HE );.      retu
176c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
176d0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61  ..  if( pBt->pPa
176e0 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ge1==0 ){.    rc
176f0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68   = lockBtreeWith
17700 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66  Retry(p);.    if
17710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17720 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17730 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
17740 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
17750 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
17760 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17770 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
17780 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29  >pPager, (int *)
17790 26 6e 50 61 67 65 29 3b 20 0a 20 20 69 66 28 20  &nPage); .  if( 
177a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
177b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
177c0 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65    }.  if( iTable
177d0 3d 3d 31 20 26 26 20 6e 50 61 67 65 3d 3d 30 20  ==1 && nPage==0 
177e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
177f0 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f  TE_EMPTY;.    go
17800 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
17810 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
17820 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
17830 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
17840 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
17850 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20  ->apPage[0]);.  
17860 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17870 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72  K ){.    goto cr
17880 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
17890 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
178a0 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
178b0 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
178c0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
178d0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
178e0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
178f0 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  es, link the cur
17900 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
17910 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73  hared list and s
17920 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20  et *ppCur (the. 
17930 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d   ** output argum
17940 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
17950 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43  tion)..  */.  pC
17960 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
17970 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
17980 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
17990 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
179a0 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
179b0 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70   (u8)wrFlag;.  p
179c0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
179d0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
179e0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
179f0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
17a00 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
17a10 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
17a20 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
17a30 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
17a40 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75  R_INVALID;.  pCu
17a50 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  r->cachedRowid =
17a60 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51   0;..  return SQ
17a70 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65  LITE_OK;..create
17a80 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
17a90 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  n:.  releasePage
17aa0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  (pCur->apPage[0]
17ab0 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  );.  unlockBtree
17ac0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
17ad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
17ae0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
17af0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
17b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
17b30 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
17b40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
17b70 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
17b80 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
17bc0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
17bd0 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
17be0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c00 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
17c10 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
17c20 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
17c50 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
17c60 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
17c70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17c80 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
17c90 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
17ca0 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
17cb0 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
17cc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17cd0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17ce0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17cf0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
17d00 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
17d10 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
17d20 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
17d30 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
17d40 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
17d50 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
17d60 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
17d70 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
17d80 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
17d90 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
17da0 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
17db0 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
17dc0 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
17dd0 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
17de0 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
17df0 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
17e00 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
17e10 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
17e20 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
17e30 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72  urn sizeof(BtCur
17e40 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  sor);.}../*.** S
17e50 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  et the cached ro
17e60 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65  wid value of eve
17e70 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65  ry cursor in the
17e80 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
17e90 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61  ile.** as pCur a
17ea0 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61  nd having the sa
17eb0 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  me root page num
17ec0 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68  ber as pCur.  Th
17ed0 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  e value is.** se
17ee0 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a  t to iRowid..**.
17ef0 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65  ** Only positive
17f00 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72   rowid values ar
17f10 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c  e considered val
17f20 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68  id for this cach
17f30 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20  e..** The cache 
17f40 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
17f50 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69  o zero, indicati
17f60 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61  ng an invalid ca
17f70 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20  che..** A btree 
17f80 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77  will work fine w
17f90 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  ith zero or nega
17fa0 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65  tive rowids.  We
17fb0 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20   just cannot.** 
17fc0 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65  cache zero or ne
17fd0 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77  gative rowids, w
17fe0 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65  hich means table
17ff0 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20  s that use zero 
18000 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72  or.** negative r
18010 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20  owids might run 
18020 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
18030 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63    But in practic
18040 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65  e, zero.** or ne
18050 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72  gative rowids ar
18060 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20  e very uncommon 
18070 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  so this should n
18080 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
18090 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
180a0 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f  BtreeSetCachedRo
180b0 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
180c0 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ur, sqlite3_int6
180d0 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43  4 iRowid){.  BtC
180e0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28  ursor *p;.  for(
180f0 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75  p=pCur->pBt->pCu
18100 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
18110 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
18120 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d  >pgnoRoot==pCur-
18130 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63  >pgnoRoot ) p->c
18140 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f  achedRowid = iRo
18150 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  wid;.  }.  asser
18160 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  t( pCur->cachedR
18170 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a  owid==iRowid );.
18180 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18190 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
181a0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
181b0 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69  ursor.  A negati
181c0 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65  ve or zero.** re
181d0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
181e0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f  ates that the ro
181f0 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76  wid cache is inv
18200 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
18210 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  be.** ignored.  
18220 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  If the rowid cac
18230 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  he has never bef
18240 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68  ore been set, th
18250 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20  en a.** zero is 
18260 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  returned..*/.sql
18270 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
18280 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64  e3BtreeGetCached
18290 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
182a0 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
182b0 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
182c0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  d;.}../*.** Clos
182d0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
182e0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
182f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18300 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
18310 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
18320 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
18330 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18340 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
18350 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
18360 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
18370 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
18380 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
18390 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
183a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
183b0 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
183c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
183d0 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
183e0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
183f0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
18400 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
18410 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
18420 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
18430 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
18440 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
18450 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
18460 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
18470 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
18480 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
18490 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
184a0 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
184b0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
184c0 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
184d0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
184e0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
184f0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
18500 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
18510 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
18520 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
18530 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
18540 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
18550 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
18560 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18570 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
18580 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18590 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
185a0 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  ke a temporary c
185b0 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67  ursor by filling
185c0 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f   in the fields o
185d0 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54  f pTempCur..** T
185e0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72  he temporary cur
185f0 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68  sor is not on th
18600 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f  e cursor list fo
18610 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a  r the Btree..*/.
18620 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
18630 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42  eGetTempCursor(B
18640 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42  tCursor *pCur, B
18650 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75  tCursor *pTempCu
18660 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
18670 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18680 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18690 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43  .  memcpy(pTempC
186a0 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66  ur, pCur, sizeof
186b0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 70  (BtCursor));.  p
186c0 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  TempCur->pNext =
186d0 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e   0;.  pTempCur->
186e0 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f 72  pPrev = 0;.  for
186f0 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43 75  (i=0; i<=pTempCu
18700 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
18710 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18720 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 61 70  Ref(pTempCur->ap
18730 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65  Page[i]->pDbPage
18740 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
18750 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79 3d   pTempCur->pKey=
18760 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  =0 );.}../*.** D
18770 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72  elete a temporar
18780 79 20 63 75 72 73 6f 72 20 73 75 63 68 20 61 73  y cursor such as
18790 20 77 61 73 20 6d 61 64 65 20 62 79 20 74 68 65   was made by the
187a0 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79   CreateTemporary
187b0 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63  Cursor().** func
187c0 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76  tion above..*/.v
187d0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
187e0 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  ReleaseTempCurso
187f0 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
18800 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
18810 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
18820 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
18830 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
18840 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
18850 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
18860 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 61 70 50  rUnref(pCur->apP
18870 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29  age[i]->pDbPage)
18880 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
18890 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
188a0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  ;.}..../*.** Mak
188b0 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
188c0 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
188d0 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
188e0 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
188f0 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
18900 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
18910 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
18920 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42  call.** sqlite3B
18930 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
18940 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
18950 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
18960 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
18970 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
18980 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
18990 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
189a0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
189b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
189c0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
189d0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
189e0 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
189f0 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
18a00 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
18a10 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
18a20 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
18a30 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
18a40 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
18a50 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
18a60 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
18a70 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
18a80 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
18a90 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
18aa0 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
18ab0 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
18ac0 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
18ad0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
18ae0 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
18af0 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
18b00 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
18b10 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20  doing agressive 
18b20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77  inlining.)  So w
18b30 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e  e use a real fun
18b40 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56  ction.** for MSV
18b50 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f  C and a macro fo
18b60 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  r everything els
18b70 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37  e.  Ticket #2457
18b80 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
18b90 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
18ba0 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
18bb0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
18bc0 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
18bd0 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61  nfo;.    int iPa
18be0 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
18bf0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
18c00 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
18c10 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  fo));.    sqlite
18c20 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
18c30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
18c40 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
18c50 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
18c60 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
18c70 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
18c80 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
18c90 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
18ca0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
18cb0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
18cc0 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
18cd0 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
18ce0 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
18cf0 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
18d00 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
18d10 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
18d20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
18d30 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
18d40 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
18d50 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
18d60 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
18d70 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
18d80 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
18d90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
18da0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
18db0 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
18dc0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
18dd0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
18de0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
18df0 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ey = 1;.    }els
18e00 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  e{.      assertC
18e10 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
18e20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f     }.  }.#else /
18e30 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45  * if not _MSC_VE
18e40 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20  R */.  /* Use a 
18e50 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68  macro in all oth
18e60 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20  er compilers so 
18e70 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
18e80 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a  n is inlined */.
18e90 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49  #define getCellI
18ea0 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20  nfo(pCur)       
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
18ee0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
18ef0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  \.    int iPage 
18f40 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20  = pCur->iPage;  
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   \.    sqlite3Bt
18f90 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
18fa0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
18fb0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
18fc0 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
18fd0 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61  ; \.    pCur->va
18fe0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19020 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
19080 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
190d0 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
190e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
190f0 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
19100 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
19110 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
19120 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
19130 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
19140 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
19150 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
19160 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
19170 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
19180 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
19190 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
191a0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
191b0 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
191c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
191d0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
191e0 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
191f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19200 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69  in the key..*/.i
19210 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
19220 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
19230 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
19240 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
19250 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19260 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
19270 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
19280 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
19290 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
192a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
192b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
192c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
192d0 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
192e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
192f0 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
19300 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19310 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
19320 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
19330 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19340 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
19350 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
19360 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
19370 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
19380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19390 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
193a0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
193b0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
193c0 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
193d0 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
193e0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ntly points to. 
193f0 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53   Always return S
19400 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69  QLITE_OK..** Fai
19410 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
19420 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75  ible.  If the cu
19430 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72  rsor is not curr
19440 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
19450 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77  g to an entry (w
19460 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c  hich can happen,
19470 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   for example, if
19480 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19490 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20   is empty) then 
194a0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
194b0 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
194c0 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
194d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
194e0 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  u32 *pSize){.  i
194f0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
19500 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19510 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
19520 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
19530 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
19540 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19550 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
19560 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
19570 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
19580 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
19590 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
195a0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
195b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
195c0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  VALID ){.      /
195d0 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  * Not pointing a
195e0 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  t a valid entry 
195f0 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  - set *pSize to 
19600 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69  0. */.      *pSi
19610 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
19620 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
19630 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
19640 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
19650 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20  >info.nData;.   
19660 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19670 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
19680 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
19690 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
196a0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
196b0 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
196c0 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
196d0 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
196e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
196f0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
19700 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
19710 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
19720 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
19730 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
19740 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
19750 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
19760 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
19770 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
19780 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
19790 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
197a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
197b0 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
197c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
197d0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
197e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
197f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
19800 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
19810 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
19820 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
19830 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
19840 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
19850 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
19860 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
19870 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
19880 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
19890 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
198a0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
198b0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
198c0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
198d0 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
198e0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
198f0 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
19900 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
19910 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
19920 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
19930 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
19940 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
19950 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
19960 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
19970 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
19980 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
19990 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
199a0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
199b0 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
199c0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
199d0 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
199e0 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
199f0 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
19a00 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
19a10 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
19a20 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
19a30 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
19a40 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
19a50 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f   *pBt, .  Pgno o
19a60 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
19a70 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c         /* Overfl
19a80 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d  ow page */.  Mem
19a90 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
19aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
19ab0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
19ac0 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
19ad0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
19ae0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
19af0 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
19b00 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
19b10 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
19b20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
19b30 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
19b40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19b50 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
19b60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19b70 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
19b80 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
19b90 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
19ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19bb0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
19bc0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
19bd0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
19be0 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
19bf0 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
19c00 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
19c10 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
19c20 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
19c30 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
19c40 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
19c50 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
19c60 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
19c70 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
19c80 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
19c90 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
19ca0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
19cb0 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
19cc0 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
19cd0 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
19ce0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
19cf0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
19d00 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
19d10 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
19d20 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
19d30 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
19d40 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
19d50 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
19d60 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
19d70 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
19d80 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
19d90 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
19da0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
19db0 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  ss<=pagerPagecou
19dc0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
19dd0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
19de0 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
19df0 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
19e00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19e10 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
19e20 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
19e30 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
19e40 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
19e50 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
19e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
19e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19e80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
19e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19ea0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19eb0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
19ec0 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
19ed0 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  e, 0);.    asser
19ee0 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
19ef0 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20  || pPage==0);.  
19f00 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26    if( next==0 &&
19f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19f20 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
19f30 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
19f40 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
19f50 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
19f60 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
19f70 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
19f80 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
19f90 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
19fa0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
19fb0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
19fc0 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
19fd0 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
19fe0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
19ff0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
1a000 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
1a010 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
1a020 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
1a030 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
1a040 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
1a050 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
1a060 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
1a070 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
1a080 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
1a090 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
1a0a0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
1a0b0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
1a0c0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
1a0d0 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
1a0e0 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
1a0f0 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
1a100 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1a110 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
1a120 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
1a130 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
1a140 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
1a150 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
1a160 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
1a170 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1a180 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
1a190 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
1a1a0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
1a1b0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
1a1c0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
1a1d0 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
1a1e0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
1a1f0 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
1a200 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
1a210 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1a220 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
1a230 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
1a240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a250 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1a260 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
1a270 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
1a280 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
1a290 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
1a2a0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
1a2b0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
1a2c0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
1a2d0 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
1a2e0 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
1a2f0 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
1a300 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1a310 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
1a320 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
1a330 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
1a340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a350 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
1a360 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a380 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a390 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
1a3a0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
1a3b0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
1a3c0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1a3d0 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
1a3e0 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
1a3f0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
1a400 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
1a410 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
1a420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a430 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
1a440 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a450 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
1a460 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
1a470 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
1a480 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1a490 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
1a4a0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1a4b0 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
1a4c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
1a4d0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
1a4e0 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
1a4f0 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
1a500 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
1a510 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
1a520 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
1a530 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
1a540 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
1a550 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
1a560 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
1a570 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
1a580 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
1a590 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
1a5a0 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
1a5b0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
1a5c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a5d0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
1a5e0 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74   distinction bet
1a5f0 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74  ween key and dat
1a600 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65  a..** It just re
1a610 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62 79  ads or writes by
1a620 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79  tes from the pay
1a630 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61  load area.  Data
1a640 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61   might .** appea
1a650 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61  r on the main pa
1a660 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ge or be scatter
1a670 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
1a680 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  le overflow .** 
1a690 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
1a6a0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
1a6b0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1a6c0 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
1a6d0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
1a6e0 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
1a6f0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
1a700 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
1a710 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
1a720 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
1a730 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
1a740 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
1a750 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
1a760 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
1a770 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1a780 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
1a790 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
1a7a0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
1a7b0 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
1a7c0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
1a7d0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
1a7e0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
1a7f0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1a800 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1a810 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
1a820 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1a830 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
1a840 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
1a850 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
1a860 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
1a870 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
1a880 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
1a890 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
1a8a0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
1a8b0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
1a8c0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
1a8d0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
1a8e0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1a8f0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
1a900 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
1a910 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
1a920 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
1a930 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
1a940 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
1a950 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
1a960 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
1a970 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1a980 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1a990 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
1a9a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1a9b0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1a9c0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1a9d0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1a9e0 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
1a9f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
1aa00 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
1aa10 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
1aa20 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1aa40 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
1aa50 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
1aa60 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
1aa70 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
1aa80 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
1aa90 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70  r */ .  int skip
1aaa0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Key,         /* 
1aab0 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74  offset begins at
1aac0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
1aad0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65   true */.  int e
1aae0 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Op              
1aaf0 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e  /* zero to read.
1ab00 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69   non-zero to wri
1ab10 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  te. */.){.  unsi
1ab20 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
1ab30 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oad;.  int rc = 
1ab40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32  SQLITE_OK;.  u32
1ab50 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64   nKey;.  int iId
1ab60 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
1ab70 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
1ab80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ab90 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
1aba0 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
1abb0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
1abc0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
1abd0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
1abe0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
1abf0 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
1ac00 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
1ac10 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
1ac20 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1ac30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ac40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ac50 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1ac60 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
1ac70 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
1ac80 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1ac90 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65  x(pCur) );..  ge
1aca0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1acb0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
1acc0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b  ur->info.pCell +
1acd0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
1ace0 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70  der;.  nKey = (p
1acf0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30  Page->intKey ? 0
1ad00 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   : (int)pCur->in
1ad10 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28  fo.nKey);..  if(
1ad20 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
1ad30 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a  offset += nKey;.
1ad40 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74    }.  if( offset
1ad50 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
1ad60 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a 20 20  ->info.nData .  
1ad70 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43   || &aPayload[pC
1ad80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1ad90 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
1ada0 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
1adb0 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ].  ){.    /* Tr
1adc0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
1add0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
1ade0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
1adf0 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
1ae00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ae10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ae20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
1ae30 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
1ae40 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
1ae50 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
1ae60 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
1ae70 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
1ae80 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1ae90 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
1aea0 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
1aeb0 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
1aec0 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
1aed0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1aee0 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
1aef0 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
1af00 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1af10 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1af20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
1af30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
1af40 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
1af50 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
1af60 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
1af70 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
1af80 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1af90 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1afa0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
1afb0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
1afc0 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
1afd0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1afe0 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
1aff0 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
1b000 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
1b010 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
1b020 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
1b030 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
1b040 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
1b050 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b060 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1b070 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
1b080 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1b090 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
1b0a0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
1b0b0 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
1b0c0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1b0d0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
1b0e0 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
1b0f0 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
1b100 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
1b110 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
1b120 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1b130 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
1b140 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
1b150 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
1b160 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1b170 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
1b180 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
1b190 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
1b1a0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
1b1b0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
1b1c0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
1b1d0 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
1b1e0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
1b1f0 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
1b200 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
1b210 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
1b220 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
1b230 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
1b240 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
1b250 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
1b260 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
1b270 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
1b280 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
1b290 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
1b2a0 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
1b2b0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
1b2c0 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
1b2d0 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21    if( nOvfl && !
1b2e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1b2f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b300 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b310 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1b320 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
1b330 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1b340 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1b350 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
1b360 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
1b370 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
1b380 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
1b390 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
1b3a0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
1b3b0 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
1b3c0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1b3d0 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
1b3e0 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
1b3f0 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
1b400 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
1b410 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
1b420 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
1b430 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1b440 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
1b450 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
1b460 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
1b470 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
1b480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b490 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
1b4a0 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
1b4b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b4c0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
1b4d0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
1b4e0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
1b4f0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1b500 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
1b510 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1b520 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
1b530 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
1b540 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
1b550 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1b560 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
1b570 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
1b580 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1b590 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
1b5a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1b5b0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
1b5c0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
1b5d0 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
1b5e0 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
1b5f0 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
1b600 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
1b610 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
1b620 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
1b630 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1b640 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
1b650 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
1b660 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
1b670 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
1b680 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
1b690 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
1b6a0 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
1b6b0 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
1b6c0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
1b6d0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1b6e0 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
1b6f0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
1b700 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1b710 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1b720 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
1b730 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
1b740 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1b750 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
1b760 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
1b770 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1b780 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
1b790 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
1b7a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
1b7b0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
1b7c0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
1b7d0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
1b7e0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
1b7f0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
1b800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1b810 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
1b820 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
1b830 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
1b840 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
1b850 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
1b860 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
1b870 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
1b880 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
1b890 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
1b8a0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
1b8b0 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  bPage;.        i
1b8c0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1b8d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b8e0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
1b8f0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
1b900 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
1b910 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b930 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
1b940 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
1b950 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
1b960 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1b970 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
1b980 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
1b990 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
1b9a0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
1b9b0 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
1b9c0 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
1b9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b9e0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
1b9f0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
1ba00 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
1ba10 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
1ba20 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1ba30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
1ba40 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1ba50 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
1ba60 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
1ba70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66  ;.          pBuf
1ba80 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d   += a;.        }
1ba90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1baa0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1bab0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1bac0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1bad0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1bae0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1baf0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1bb00 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
1bb10 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
1bb20 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
1bb30 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
1bb40 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
1bb50 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
1bb60 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
1bb70 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
1bb80 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
1bb90 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1bba0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
1bbb0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1bbc0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1bbd0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
1bbe0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1bbf0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
1bc00 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
1bc10 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
1bc20 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
1bc30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1bc40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1bc50 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
1bc60 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
1bc70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1bc80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1bc90 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1bca0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1bcb0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1bcc0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1bcd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bce0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1bcf0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1bd00 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
1bd10 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
1bd20 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1bd30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1bd40 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1bd50 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
1bd60 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
1bd70 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1bd80 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
1bd90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1bda0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1bdb0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
1bdc0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1bdd0 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
1bde0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
1bdf0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
1be00 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1be10 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  pBuf, 0, 0);.  }
1be20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1be30 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
1be40 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
1be50 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
1be60 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
1be70 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
1be80 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
1be90 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
1bea0 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
1beb0 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
1bec0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
1bed0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1bee0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
1bef0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
1bf00 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
1bf10 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
1bf20 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
1bf30 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
1bf40 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
1bf50 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
1bf60 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
1bf70 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
1bf80 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1bf90 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
1bfa0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
1bfb0 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
1bfc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1bfd0 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
1bfe0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1bff0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1c000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1c010 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
1c020 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1c030 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1c040 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1c050 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1c060 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1c070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1c090 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1c0a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
1c0b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1c0c0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1c0d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1c0e0 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
1c0f0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1c100 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
1c110 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1c120 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
1c130 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
1c140 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
1c150 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31  et, amt, pBuf, 1
1c160 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1c170 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c180 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1c190 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
1c1a0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
1c1b0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
1c1c0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
1c1d0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
1c1e0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
1c1f0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
1c200 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
1c210 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64  f skipKey==0 and
1c220 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1c230 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
1c240 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65  ata if.** skipKe
1c250 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65  y==1.  The numbe
1c260 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
1c270 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61  ailable key/data
1c280 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
1c290 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
1c2a0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
1c2b0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1c2c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20   will not be.** 
1c2d0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
1c2e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c2f0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
1c300 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
1c310 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
1c320 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
1c330 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
1c340 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
1c350 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
1c360 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
1c370 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
1c380 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
1c390 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
1c3a0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
1c3b0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
1c3c0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
1c3d0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
1c3e0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
1c3f0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
1c400 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
1c410 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
1c420 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
1c430 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
1c440 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
1c450 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
1c460 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
1c470 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
1c480 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
1c490 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
1c4a0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
1c4b0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
1c4c0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
1c4d0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
1c4e0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
1c4f0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
1c500 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
1c510 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
1c520 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
1c530 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1c540 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
1c550 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
1c560 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
1c570 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1c580 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
1c590 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
1c5a0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
1c5b0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
1c5c0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
1c5d0 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
1c5e0 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
1c5f0 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
1c600 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
1c610 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
1c620 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
1c630 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
1c640 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1c650 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75  .  u32 nKey;.  u
1c660 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  32 nLocal;..  as
1c670 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
1c680 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1c690 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
1c6a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
1c6b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1c6c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1c6d0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1c6e0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c6f0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61  x(pCur) );.  pPa
1c700 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1c710 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
1c720 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c730 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1c740 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
1c750 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
1c760 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
1c770 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
1c780 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61  pCell;.  aPayloa
1c790 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  d += pCur->info.
1c7a0 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70  nHeader;.  if( p
1c7b0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1c7c0 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20      nKey = 0;.  
1c7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20  }else{.    nKey 
1c7e0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
1c7f0 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
1c800 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
1c810 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
1c820 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
1c830 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1c840 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
1c850 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
1c860 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1c870 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61  l;.    if( nLoca
1c880 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  l>nKey ){.      
1c890 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20  nLocal = nKey;. 
1c8a0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74     }.  }.  *pAmt
1c8b0 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74   = nLocal;.  ret
1c8c0 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a  urn aPayload;.}.
1c8d0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
1c8e0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
1c8f0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
1c900 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
1c910 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
1c920 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
1c930 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
1c940 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
1c950 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
1c960 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
1c970 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
1c980 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
1c990 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
1c9a0 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
1c9b0 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
1c9c0 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
1c9d0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
1c9e0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
1c9f0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
1ca00 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
1ca10 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
1ca20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
1ca30 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
1ca40 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
1ca50 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
1ca60 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
1ca70 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
1ca80 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
1ca90 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
1caa0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
1cab0 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
1cac0 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
1cad0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
1cae0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1caf0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
1cb00 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
1cb10 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
1cb20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
1cb30 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
1cb40 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
1cb50 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1cb60 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1cb70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
1cb80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1cb90 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
1cba0 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
1cbb0 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1cbc0 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
1cbd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1cbe0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
1cbf0 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
1cc00 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
1cc10 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
1cc20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1cc30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1cc40 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1cc50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1cc60 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1cc70 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1cc80 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1cc90 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
1cca0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
1ccb0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1ccc0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
1ccd0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
1cce0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
1ccf0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
1cd00 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1cd10 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
1cd20 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61   move to..*/.sta
1cd30 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
1cd40 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
1cd50 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
1cd60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
1cd70 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  t i = pCur->iPag
1cd80 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  e;.  MemPage *pN
1cd90 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ewPage;.  BtShar
1cda0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1cdb0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
1cdc0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1cdd0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1cde0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1cdf0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1ce00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1ce10 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
1ce20 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
1ce30 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
1ce40 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
1ce50 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
1ce60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1ce70 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1ce80 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
1ce90 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
1cea0 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20  o, &pNewPage);. 
1ceb0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1cec0 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50   rc;.  pCur->apP
1ced0 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50  age[i+1] = pNewP
1cee0 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  age;.  pCur->aiI
1cef0 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  dx[i+1] = 0;.  p
1cf00 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20  Cur->iPage++;.. 
1cf10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1cf20 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1cf30 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1cf40 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
1cf50 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74  ell<1 ){.    ret
1cf60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1cf70 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1cf80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1cf90 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
1cfa0 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
1cfb0 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
1cfc0 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
1cfd0 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
1cfe0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
1cff0 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
1d000 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
1d010 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
1d020 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
1d030 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
1d040 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
1d050 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
1d060 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1d070 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
1d080 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
1d090 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
1d0a0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
1d0b0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
1d0c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1d0d0 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
1d0e0 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
1d0f0 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
1d100 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
1d110 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
1d120 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
1d130 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
1d140 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
1d150 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
1d160 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
1d170 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
1d180 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
1d190 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
1d1a0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
1d1b0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
1d1c0 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
1d1d0 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
1d1e0 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
1d1f0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
1d200 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
1d210 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1d220 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
1d230 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
1d240 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
1d250 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
1d260 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
1d270 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
1d280 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
1d290 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1d2a0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
1d2b0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
1d2c0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
1d2d0 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
1d2e0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
1d2f0 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
1d300 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
1d310 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
1d320 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1d330 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
1d340 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
1d350 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1d360 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1d370 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1d380 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1d390 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1d3a0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
1d3b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1d3c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1d3d0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
1d3e0 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
1d3f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1d400 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
1d410 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1d420 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
1d430 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
1d440 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
1d450 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61  gno.  );.  relea
1d460 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1d470 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1d480 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
1d490 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  --;.  pCur->info
1d4a0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1d4b0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1d4c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
1d4d0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1d4e0 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a  he root page.*/.
1d4f0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1d500 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
1d510 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
1d520 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
1d530 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d540 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
1d550 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
1d560 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1d570 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
1d580 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1d590 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1d5a0 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
1d5b0 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
1d5c0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
1d5d0 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
1d5e0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
1d5f0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
1d600 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
1d610 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
1d620 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
1d630 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
1d640 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1d650 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
1d660 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d670 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
1d680 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
1d690 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  kip;.    }.    s
1d6a0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1d6b0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1d6c0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
1d6d0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
1d6e0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1d6f0 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  1; i<=pCur->iPag
1d700 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
1d710 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
1d720 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1d730 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d740 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54  if( .      SQLIT
1d750 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41  E_OK!=(rc = getA
1d760 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1d770 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
1d780 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
1d790 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
1d7a0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1d7b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1d7c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d7d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f      }.  }..  pRo
1d7e0 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
1d7f0 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
1d800 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
1d810 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20  r->pgnoRoot );. 
1d820 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
1d830 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
1d840 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
1d850 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1d860 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
1d870 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1d880 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
1d890 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
1d8a0 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
1d8b0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
1d8c0 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72  bpage;.    asser
1d8d0 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
1d8e0 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65  1 );.    subpage
1d8f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
1d900 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
1d910 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1d920 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70      assert( subp
1d930 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75  age>0 );.    pCu
1d940 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1d950 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
1d960 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1d970 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
1d980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
1d990 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f  ->eState = ((pRo
1d9a0 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52  ot->nCell>0)?CUR
1d9b0 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52  SOR_VALID:CURSOR
1d9c0 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20  _INVALID);.  }. 
1d9d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d9e0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1d9f0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
1da00 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1da10 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1da20 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
1da30 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
1da40 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
1da50 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
1da60 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
1da70 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
1da80 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
1da90 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
1daa0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1dab0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
1dac0 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
1dad0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1dae0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1daf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1db00 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1db10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1db20 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1db30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1db40 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1db50 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1db60 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1db70 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1db80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1db90 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
1dba0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1dbb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1dbc0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1dbd0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
1dbe0 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
1dbf0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
1dc00 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1dc10 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d  age]));.    rc =
1dc20 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1dc30 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
1dc40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1dc50 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1dc60 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
1dc70 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
1dc80 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1dc90 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
1dca0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
1dcb0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
1dcc0 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
1dcd0 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
1dce0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
1dcf0 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
1dd00 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
1dd10 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
1dd20 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
1dd30 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1dd40 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
1dd50 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
1dd60 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
1dd70 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
1dd80 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
1dd90 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
1dda0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
1ddb0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
1ddc0 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
1ddd0 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
1dde0 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
1ddf0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1de00 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
1de10 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
1de20 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
1de30 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
1de40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
1de50 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
1de60 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1de70 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1de80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1de90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1dea0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1deb0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1dec0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1ded0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1dee0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
1def0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
1df00 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1df10 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1df20 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1df30 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1df40 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
1df50 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
1df60 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1df70 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
1df80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1df90 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  OK ){.    pCur->
1dfa0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1dfb0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
1dfc0 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l-1;.    pCur->i
1dfd0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1dfe0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1dff0 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1e000 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1e010 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1e020 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
1e030 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1e040 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1e050 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1e060 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1e070 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1e080 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1e090 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1e0a0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1e0b0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1e0c0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1e0d0 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
1e0e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1e0f0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1e100 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1e110 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e120 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e130 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1e140 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1e150 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1e160 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
1e170 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1e180 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e190 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
1e1a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1e1b0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1e1c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e1d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1e1e0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
1e1f0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1e200 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  1;.      rc = SQ
1e210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1e220 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e230 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1e240 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1e250 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
1e260 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1e270 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1e280 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
1e290 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e2a0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1e2b0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
1e2c0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1e2d0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1e2e0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1e2f0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1e300 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1e310 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1e320 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1e330 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1e340 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1e350 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1e360 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e370 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
1e380 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1e390 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
1e3a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e3b0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e3c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1e3d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1e3e0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1e3f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1e400 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1e410 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1e420 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e430 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1e440 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1e450 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1e460 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1e470 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1e480 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
1e490 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
1e4a0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1e4b0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1e4c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1e4d0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1e4e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1e4f0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
1e500 72 29 3b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  r);.      getCel
1e510 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1e520 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20     pCur->atLast 
1e530 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  = rc==SQLITE_OK 
1e540 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ?1:0;.    }.  }.
1e550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e560 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1e570 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
1e580 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
1e590 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
1e5a0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
1e5b0 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
1e5c0 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
1e5d0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
1e5e0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
1e5f0 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
1e600 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
1e610 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
1e620 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
1e630 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
1e640 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
1e650 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
1e660 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
1e670 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
1e680 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
1e690 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1e6a0 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
1e6b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1e6c0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
1e6d0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
1e6e0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
1e6f0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
1e700 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
1e710 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
1e720 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
1e730 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
1e740 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
1e750 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
1e760 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
1e770 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
1e780 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
1e790 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
1e7a0 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
1e7b0 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
1e7c0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
1e7d0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
1e7e0 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
1e7f0 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
1e800 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
1e810 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
1e820 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
1e830 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1e840 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1e850 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1e860 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
1e870 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
1e880 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
1e890 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
1e8a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e8b0 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
1e8c0 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
1e8d0 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
1e8e0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
1e8f0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
1e900 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1e910 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1e920 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
1e940 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
1e950 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
1e960 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
1e970 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1e980 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1e990 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1e9a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1e9b0 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
1e9c0 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
1e9d0 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
1e9e0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1e9f0 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
1ea00 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1ea10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1ea20 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
1ea30 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1ea40 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
1ea50 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
1ea60 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
1ea70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1ea80 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
1ea90 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
1eaa0 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
1eab0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
1eac0 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
1ead0 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
1eae0 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
1eaf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1eb00 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
1eb10 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
1eb20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1eb30 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1eb40 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1eb50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1eb60 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1eb70 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1eb80 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
1eb90 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
1eba0 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
1ebb0 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
1ebc0 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
1ebd0 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
1ebe0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
1ebf0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
1ec00 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
1ec10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1ec20 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d  R_VALID && pCur-
1ec30 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26  >validNKey .   &
1ec40 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
1ec50 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
1ec60 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1ec70 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
1ec80 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
1ec90 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1eca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ecb0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1ecc0 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e  atLast && pCur->
1ecd0 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
1ece0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
1ecf0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
1ed00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ed10 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20    }.  }..  rc = 
1ed20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1ed30 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1ed40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1ed50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ed60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ed70 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
1ed80 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1ed90 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
1eda0 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75  nit );.  if( pCu
1edb0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1edc0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1edd0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
1ede0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1edf0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1ee00 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
1ee10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ee20 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
1ee30 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1ee40 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
1ee50 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
1ee60 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
1ee70 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20  , upr;.    Pgno 
1ee80 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
1ee90 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1eea0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1eeb0 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20  iPage];.    int 
1eec0 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73  c = -1;  /* pRes
1eed0 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65   return if table
1eee0 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62   is empty must b
1eef0 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20  e -1 */.    lwr 
1ef00 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
1ef10 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
1ef20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 2d 3e     if( (!pPage->
1ef30 69 6e 74 4b 65 79 20 26 26 20 70 49 64 78 4b 65  intKey && pIdxKe
1ef40 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c 30 20 29  y==0) || upr<0 )
1ef50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ef60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ef70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
1ef80 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1ef90 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69  }.    if( biasRi
1efa0 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ght ){.      pCu
1efb0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1efc0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75 70 72  Page] = (u16)upr
1efd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1efe0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1eff0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
1f000 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f 32 29  16)((upr+lwr)/2)
1f010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1f020 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  ;;){.      void 
1f030 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
1f040 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
1f050 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70       int idx = p
1f060 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f070 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 70  >iPage];.      p
1f080 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1f090 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  = 0;.      pCur-
1f0a0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1f0b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1f0c0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1f0d0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
1f0e0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
1f0f0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
1f100 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
1f110 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
1f120 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
1f130 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
1f140 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
1f150 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
1f160 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
1f170 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  l, dummy);.     
1f180 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
1f190 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
1f1a0 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
1f1b0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
1f1c0 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  lKey==intKey ){.
1f1d0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
1f1e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1f1f0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
1f200 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1f210 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1f220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f230 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
1f240 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  y>intKey );.    
1f250 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
1f260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1f270 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1f280 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20   available;.    
1f290 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28      pCellKey = (
1f2a0 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c  void *)fetchPayl
1f2b0 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c  oad(pCur, &avail
1f2c0 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
1f2d0 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75    nCellKey = pCu
1f2e0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1f2f0 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61        if( availa
1f300 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b  ble>=nCellKey ){
1f310 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
1f320 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1f330 43 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e 43 65  Compare((int)nCe
1f340 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1f350 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
1f360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f370 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
1f380 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69  qlite3Malloc( (i
1f390 6e 74 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20  nt)nCellKey );. 
1f3a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1f3b0 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
1f3c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1f3d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1f3e0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
1f3f0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
1f400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1f420 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
1f430 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 28 76  int)nCellKey, (v
1f440 6f 69 64 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a  oid*)pCellKey);.
1f450 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
1f460 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1f470 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e 43 65 6c  ompare((int)nCel
1f480 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  lKey, pCellKey, 
1f490 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
1f4a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f4b0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
1f4c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
1f4d0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1f4e0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
1f4f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1f500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1f510 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
1f520 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1f530 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1f540 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
1f550 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
1f560 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
1f570 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1f580 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1f590 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1f5a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f5b0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1f5c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f5d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1f5e0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1f5f0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
1f600 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1f610 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
1f620 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
1f630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f640 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
1f650 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
1f660 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
1f670 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
1f680 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
1f690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f6a0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
1f6b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1f6c0 67 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72  ge] = (u16)((lwr
1f6d0 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +upr)/2);.    }.
1f6e0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
1f6f0 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73  =upr+1 );.    as
1f700 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1f710 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
1f720 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1f730 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a      chldPg = 0;.
1f740 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77      }else if( lw
1f750 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
1f760 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1f770 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1f780 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1f790 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1f7a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f7b0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
1f7c0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1f7d0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
1f7e0 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30     if( chldPg==0
1f7f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1f800 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1f810 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
1f820 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f830 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
1f840 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1f850 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
1f860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f870 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
1f880 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
1f890 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1f8a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1f8b0 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43  (u16)lwr;.    pC
1f8c0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1f8d0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1f8e0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20  lidNKey = 0;.   
1f8f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1f900 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
1f910 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1f920 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1f930 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
1f940 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ish:.  return rc
1f950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
1f960 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
1f970 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
1f980 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
1f990 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
1f9a0 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
1f9b0 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1f9c0 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
1f9d0 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
1f9e0 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
1f9f0 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
1fa00 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
1fa10 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  e work..*/.int s
1fa20 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1fa30 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
1fa40 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
1fa50 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
1fa60 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
1fa70 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
1fa80 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
1fa90 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
1faa0 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
1fab0 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
1fac0 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
1fad0 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
1fae0 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
1faf0 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
1fb00 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
1fb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
1fb20 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
1fb30 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
1fb40 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
1fb50 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
1fb60 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
1fb70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
1fba0 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
1fbb0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
1fbc0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
1fbd0 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
1fbe0 72 20 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20  r aSpace[150];  
1fbf0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
1fc00 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
1fc10 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
1fc20 61 6c 6c 6f 63 20 2a 2f 0a 0a 0a 20 20 69 66 28  alloc */...  if(
1fc30 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
1fc40 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
1fc50 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
1fc60 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
1fc70 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1fc80 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ck(pCur->pKeyInf
1fc90 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b  o, (int)nKey, pK
1fca0 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63 65            aSpace
1fcd0 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
1fce0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
1fcf0 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
1fd00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1fd10 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65  else{.    pIdxKe
1fd20 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20  y = 0;.  }.  rc 
1fd30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1fd40 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75  vetoUnpacked(pCu
1fd50 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79  r, pIdxKey, nKey
1fd60 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20  , bias, pRes);. 
1fd70 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1fd80 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
1fd90 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
1fda0 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20  (pIdxKey);.  }. 
1fdb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1fdc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1fdd0 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
1fde0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
1fdf0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
1fe00 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1fe10 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
1fe20 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
1fe30 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
1fe40 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
1fe50 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
1fe60 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1fe70 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
1fe80 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
1fe90 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
1fea0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
1feb0 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
1fec0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1fed0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1fee0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
1fef0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1ff00 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
1ff10 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
1ff20 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
1ff30 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
1ff40 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
1ff50 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
1ff60 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
1ff70 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
1ff80 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
1ff90 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
1ffa0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
1ffb0 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
1ffc0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1ffd0 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
1ffe0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
1fff0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
20000 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
20010 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72  ction handle for
20020 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71   a cursor..*/.sq
20030 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74  lite3 *sqlite3Bt
20040 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73  reeCursorDb(cons
20050 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t BtCursor *pCur
20060 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
20070 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
20080 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
20090 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
200a0 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65  turn pCur->pBtre
200b0 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->db;.}../*.** 
200c0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
200d0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
200e0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
200f0 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
20100 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
20110 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
20120 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
20130 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
20140 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
20150 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
20160 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
20170 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
20180 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
20190 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
201a0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
201b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
201c0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
201d0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
201e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
201f0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
20200 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20210 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
20220 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
20230 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
20240 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20250 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
20260 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
20270 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  pRes!=0 );.  if(
20280 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
20290 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
202a0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
202b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
202c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
202d0 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
202e0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
202f0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
20300 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
20310 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
20320 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
20330 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
20340 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20350 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
20360 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20370 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
20380 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
20390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
203a0 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x<=pPage->nCell 
203b0 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
203c0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
203d0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
203e0 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
203f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
20400 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
20410 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
20420 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
20430 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
20440 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
20450 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
20460 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
20470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20480 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
20490 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
204a0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
204b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
204c0 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
204d0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
204e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
204f0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
20500 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
20510 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
20520 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20540 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
20550 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
20560 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
20570 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
20580 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20590 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
205a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
205b0 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
205c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
205d0 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
205e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
205f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20600 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
20610 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
20620 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
20640 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
20650 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
20660 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
20670 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
20680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20690 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
206a0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
206b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
206c0 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
206d0 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
206e0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
206f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
20700 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
20710 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
20720 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
20730 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
20740 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
20750 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
20760 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
20770 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
20780 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
20790 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
207a0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
207b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
207c0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
207d0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
207e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
207f0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
20800 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
20810 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
20820 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
20830 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
20840 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
20850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
20870 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
20880 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
20890 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
208a0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
208b0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
208c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
208d0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
208e0 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43  skip<0 ){.    pC
208f0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
20900 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
20910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20920 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
20930 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
20940 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
20950 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
20960 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
20970 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
20980 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
20990 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
209a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
209b0 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
209c0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
209d0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
209e0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
209f0 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
20a00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
20a10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
20a20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
20a30 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
20a40 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
20a50 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
20a60 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
20a70 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
20a80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
20a90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
20aa0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
20ab0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
20ac0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20ad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20ae0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
20af0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
20b00 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
20b10 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
20b20 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
20b30 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
20b40 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
20b50 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20b60 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
20b70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20b80 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
20b90 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
20ba0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
20bb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20bc0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
20bd0 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
20be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20bf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
20c00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
20c10 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
20c20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
20c30 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
20c40 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
20c50 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
20c60 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
20c70 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
20c80 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
20c90 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
20ca0 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
20cb0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
20cc0 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
20cd0 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
20ce0 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
20cf0 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
20d00 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
20d10 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
20d20 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
20d30 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
20d40 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
20d50 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
20d60 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
20d70 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
20d80 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
20d90 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
20da0 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
20db0 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
20dc0 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
20dd0 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
20de0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
20df0 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
20e00 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
20e10 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20e20 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
20e30 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
20e40 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
20e50 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
20e60 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
20e70 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
20e80 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
20e90 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
20ea0 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
20eb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
20ec0 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
20ed0 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
20ee0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
20ef0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
20f00 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
20f10 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
20f20 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
20f30 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
20f40 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
20f50 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
20f60 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
20f70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
20f80 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
20f90 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
20fa0 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
20fb0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
20fc0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
20fd0 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
20fe0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
20ff0 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
21000 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
21010 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
21020 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
21030 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
21040 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
21050 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
21060 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
21070 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
21080 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
21090 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
210a0 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
210b0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
210c0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
210d0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
210e0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
210f0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  freelist */.  in
21100 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t k;     /* Numb
21110 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
21120 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
21130 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
21140 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
21150 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
21160 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a  PrevTrunk = 0;..
21170 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21180 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
21190 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
211a0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
211b0 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  e1;.  n = get4by
211c0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
211d0 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e  a[36]);.  if( n>
211e0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
211f0 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
21200 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
21210 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
21220 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
21230 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
21240 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
21250 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
21260 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
21270 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
21280 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
21290 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63   /* If the 'exac
212a0 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73  t' parameter was
212b0 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72   true and a quer
212c0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
212d0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
212e0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
212f0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
21300 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
21310 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
21320 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
21330 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
21340 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
21350 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
21360 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
21370 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
21380 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62  ( exact && nearb
21390 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  y<=pagerPagecoun
213a0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
213b0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
213c0 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
213d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
213e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
213f0 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
21400 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
21410 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
21420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
21430 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
21440 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
21450 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
21460 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
21470 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
21480 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
21490 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
214a0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
214b0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
214c0 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
214d0 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
214e0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
214f0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
21500 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
21510 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
21520 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
21530 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
21540 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
21550 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
21560 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
21570 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
21580 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
21590 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
215a0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
215b0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
215c0 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
215d0 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
215e0 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
215f0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
21600 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
21610 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
21620 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
21630 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
21640 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
21650 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
21660 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
21670 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
21680 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
21690 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
216a0 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
216b0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
216c0 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
216d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
216e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
216f0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
21700 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
21710 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
21720 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
21730 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
21740 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
21750 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
21760 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
21770 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
21780 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
21790 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
217a0 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
217b0 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
217c0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
217d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  );.      if( k==
217e0 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
217f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
21800 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
21810 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
21820 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
21830 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
21840 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
21850 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
21860 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
21870 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
21880 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
21890 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
218a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
218b0 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
218c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
218d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
218e0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
218f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
21900 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
21910 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
21920 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
21930 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
21940 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
21950 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
21960 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
21970 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
21980 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
21990 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
219a0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
219b0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
219c0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
219d0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
219e0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
219f0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
21a00 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d  }else if( k>pBt-
21a10 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
21a20 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
21a30 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
21a40 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
21a50 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
21a60 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
21a70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
21a80 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
21a90 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
21aa0 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
21ab0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
21ac0 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
21ad0 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
21ae0 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  && nearby==iTrun
21af0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
21b00 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
21b10 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
21b20 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
21b30 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
21b40 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
21b50 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
21b60 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
21b70 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
21b80 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
21b90 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e  t( *pPgno==iTrun
21ba0 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  k );.        *pp
21bb0 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
21bc0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
21bd0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
21be0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21bf0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
21c00 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
21c10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
21c20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
21c30 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
21c40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21c50 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
21c60 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
21c70 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
21c80 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
21c90 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
21ca0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
21cb0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
21cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21cd0 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
21ce0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
21cf0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
21d00 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
21d10 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
21d20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
21d30 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
21d40 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
21d50 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
21d60 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
21d70 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
21d80 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
21d90 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
21da0 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
21db0 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
21dc0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
21dd0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
21de0 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
21df0 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
21e00 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
21e10 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
21e20 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
21e30 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
21e40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21e50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
21e60 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
21e70 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
21e80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21ea0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
21eb0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
21ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21ee0 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
21ef0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
21f00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
21f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21f20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
21f30 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
21f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
21f50 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
21f60 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
21f70 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
21f80 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
21f90 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
21fa0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
21fb0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
21fc0 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
21fd0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
21fe0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
21ff0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
22000 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
22010 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
22020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
22030 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
22040 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
22050 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
22060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
22070 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
22080 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
22090 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
220a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
220b0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
220c0 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
220d0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
220e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
220f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22100 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
22110 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
22120 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
22130 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
22140 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
22150 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
22160 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22170 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
22180 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
22190 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
221a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
221b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
221c0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
221d0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
221e0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
221f0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
22200 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
22210 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
22220 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22230 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
22240 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
22250 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
22260 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  int closest;.   
22270 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
22280 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
22290 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
222a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
222b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
222c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
222d0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
222e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
222f0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
22300 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
22310 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
22320 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
22330 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
22340 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20  int i, dist;.   
22350 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
22360 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
22370 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
22380 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
22390 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
223a0 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
223b0 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
223c0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
223d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
223e0 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
223f0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
22400 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
22410 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
22420 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
22430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
22440 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
22450 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
22460 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
22470 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
22480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
224a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
224b0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
224c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
224d0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
224e0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
224f0 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t*4]);.        i
22500 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
22510 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
22520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
22530 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
22540 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
22550 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
22560 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
22570 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61        nPage = pa
22580 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
22590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
225a0 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29 7b   *pPgno>nPage ){
225b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
225c0 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68  Free page off th
225d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
225e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
225f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
22600 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
22610 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
22620 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
22630 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22640 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
22650 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
22660 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
22670 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
22680 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
22690 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
226a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
226b0 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
226c0 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
226d0 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
226e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
226f0 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
22700 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
22710 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
22720 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
22730 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
22740 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
22750 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
22760 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
22770 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22780 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
22790 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
227a0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
227b0 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
227c0 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
227d0 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20  pBt, *pPgno);.  
227e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
227f0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
22800 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
22810 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
22820 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22840 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22850 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
22860 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
22870 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
22880 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22890 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
228a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
228b0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
228c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
228d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
228e0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
228f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22900 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
22910 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
22920 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
22930 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
22940 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
22950 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22960 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
22970 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
22980 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65  elist, so create
22990 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74   a new page at t
229a0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66  he.    ** end of
229b0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
229c0 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67   int nPage = pag
229d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
229e0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e  ;.    *pPgno = n
229f0 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69  Page + 1;..    i
22a00 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
22a10 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
22a20 29 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67  ) ){.      (*pPg
22a30 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69  no)++;.    }..#i
22a40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22a50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
22a60 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
22a70 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
22a80 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e  SPAGE(pBt, *pPgn
22a90 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  o) ){.      /* I
22aa0 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
22ab0 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
22ac0 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
22ad0 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
22ae0 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
22af0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
22b00 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
22b10 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
22b20 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
22b30 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
22b40 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
22b50 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
22b60 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
22b70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
22b80 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
22b90 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
22ba0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
22bb0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
22bc0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
22bd0 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  )\n", *pPgno));.
22be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
22bf0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
22c00 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
22c10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22c20 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
22c30 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67  Bt, *pPgno, &pPg
22c40 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
22c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22c60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
22c70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
22c80 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
22c90 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
22ca0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
22cb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
22cc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
22cd0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
22ce0 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50     if( *pPgno==P
22cf0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
22d00 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f  (pBt) ){ (*pPgno
22d10 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  )++; }.    }.#en
22d20 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28  dif..    assert(
22d30 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
22d40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
22d50 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
22d60 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
22d70 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
22d80 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
22d90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
22da0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22db0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
22dc0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
22dd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22df0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
22e00 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
22e10 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
22e20 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
22e30 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
22e40 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
22e50 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
22e60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
22e70 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
22e80 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
22e90 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
22ea0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
22eb0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
22ec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22ed0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
22ee0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
22ef0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
22f00 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
22f10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
22f20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
22f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f40 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
22f50 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
22f60 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
22f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22f80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22f90 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
22fa0 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
22fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22fc0 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
22fd0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
22fe0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
22ff0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
23000 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
23010 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
23020 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
23030 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
23040 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
23050 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
23060 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
23070 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
23080 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
23090 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
230a0 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
230b0 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
230c0 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
230d0 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
230e0 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
230f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
23100 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
23110 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
23120 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
23130 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
23140 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
23150 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
23160 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
23170 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
23180 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
23190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
231a0 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
231b0 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
231c0 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
231d0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
231e0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
231f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23200 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
23210 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
23220 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23240 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
23250 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
23260 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
23270 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
23280 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
23290 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
232a0 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
232b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
232e0 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
232f0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
23300 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23320 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
23330 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
23360 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
23370 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
23380 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
23390 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
233a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
233b0 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
233c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
233d0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
233e0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
233f0 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
23400 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
23410 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
23420 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
23430 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
23440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23450 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
23460 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
23470 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
23480 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
23490 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
234a0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
234b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
234c0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
234d0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
234e0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
234f0 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
23500 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
23510 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
23520 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
23530 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
23540 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
23550 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
23560 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49    /* If the SQLI
23570 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
23580 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
23590 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
235a0 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79   then.  ** alway
235b0 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
235c0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
235d0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
235e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21 70  ..  */.  if( (!p
235f0 50 61 67 65 20 26 26 20 28 72 63 20 3d 20 73 71  Page && (rc = sq
23600 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
23610 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
23620 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c  Page, 0))).   ||
23630 20 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20              (rc 
23640 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23650 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
23660 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f  ge)).  ){.    go
23670 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
23680 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50  .  }.  memset(pP
23690 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
236a0 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
236b0 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
236c0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
236d0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
236e0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
236f0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
23700 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
23710 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
23720 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
23730 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
23740 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
23750 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
23760 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
23770 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29  MAP_FREEPAGE, 0)
23780 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
23790 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
237a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
237b0 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
237c0 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
237d0 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
237e0 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
237f0 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
23800 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
23810 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
23820 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
23830 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
23840 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
23850 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
23860 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
23870 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
23880 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
23890 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
238a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
238b0 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
238c0 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
238d0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
238e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
238f0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
23900 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
23910 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
23920 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
23930 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
23940 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
23950 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
23960 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 3b 20  .    int nLeaf; 
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23980 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
23990 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
239a0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
239b0 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
239c0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
239d0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
239e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
239f0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
23a00 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
23a10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
23a20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23a30 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
23a40 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
23a50 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
23a60 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
23a70 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  4]);.    if( nLe
23a80 61 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  af<0 ){.      rc
23a90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
23aa0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
23ab0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
23ac0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
23ad0 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65  Leaf<pBt->usable
23ae0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
23af0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
23b00 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
23b10 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
23b20 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
23b30 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
23b40 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
23b50 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
23b60 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
23b70 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
23b80 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
23b90 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
23ba0 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
23bb0 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
23bc0 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
23bd0 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
23be0 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
23bf0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
23c00 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
23c10 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
23c20 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
23c30 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
23c40 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
23c50 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
23c60 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
23c70 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
23c80 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
23c90 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
23ca0 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
23cb0 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
23cc0 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
23cd0 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
23ce0 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
23cf0 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
23d00 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
23d10 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
23d20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
23d30 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74 20  ain to restrict 
23d40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
23d50 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
23d60 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
23d70 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
23d80 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
23d90 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
23da0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
23db0 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
23dc0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
23dd0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
23de0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
23df0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
23e00 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
23e10 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
23e20 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
23e30 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
23e40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
23e50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
23e60 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
23e70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
23e80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23e90 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
23ea0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
23eb0 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
23ec0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
23ed0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
23ee0 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
23ef0 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge);.#ifndef SQL
23f00 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
23f10 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  E.        if( pP
23f20 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
23f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
23f40 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
23f50 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23f60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
23f70 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
23f80 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
23f90 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
23fa0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
23fb0 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
23fc0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
23fd0 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
23fe0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
23ff0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
24000 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
24010 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
24020 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
24030 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
24040 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
24050 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
24060 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
24070 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
24080 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
24090 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
240a0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
240b0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
240c0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
240d0 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
240e0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
240f0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
24100 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
24110 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
24120 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
24130 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
24140 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
24150 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
24160 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
24170 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
24180 69 66 28 20 20 20 28 28 21 70 50 61 67 65 29 20  if(   ((!pPage) 
24190 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  && (0 != (rc = s
241a0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
241b0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
241c0 70 50 61 67 65 2c 20 30 29 29 29 29 0a 20 20 20  pPage, 0)))).   
241d0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
241e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
241f0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
24200 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f  e))).  ){.    go
24210 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
24220 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
24230 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
24240 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
24250 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
24260 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
24270 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
24280 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
24290 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
242a0 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
242b0 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
242c0 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
242d0 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
242e0 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
242f0 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
24300 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
24310 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
24320 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
24330 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
24340 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
24350 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  .}.static int fr
24360 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
24370 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
24380 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
24390 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
243a0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  age->pgno);.}../
243b0 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
243c0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
243d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
243e0 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
243f0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
24400 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
24410 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
24420 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
24430 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
24440 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
24450 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
24460 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
24470 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
24480 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50 61 67  l;.  u16 ovflPag
24490 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
244a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
244b0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
244c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
244d0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
244e0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
244f0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
24500 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
24510 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
24520 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
24530 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
24540 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
24550 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
24560 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
24570 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
24580 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
24590 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
245a0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
245b0 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
245c0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
245d0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
245e0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
245f0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
24600 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
24610 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
24620 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
24630 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
24640 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
24650 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
24660 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
24670 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
24680 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
24690 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
246a0 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72  | ovflPgno>pager
246b0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
246c0 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
246d0 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
246e0 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
246f0 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
24700 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
24710 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
24720 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
24730 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
24740 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
24750 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
24760 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
24770 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
24780 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24790 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
247a0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
247b0 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
247c0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
247d0 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
247e0 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
247f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
24800 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
24810 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
24820 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
24830 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  gno);.    if( pO
24840 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
24850 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
24860 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
24870 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
24880 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
24890 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
248a0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
248b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
248c0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
248d0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
248e0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
248f0 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
24900 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
24910 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
24920 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
24930 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
24940 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
24950 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
24960 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
24970 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
24980 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
24990 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
249a0 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
249b0 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
249c0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
249d0 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
249e0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
249f0 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
24a00 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
24a10 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
24a20 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
24a30 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
24a40 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
24a50 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
24a60 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
24a70 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
24a80 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
24a90 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
24aa0 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
24ab0 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
24ac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
24ad0 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
24ae0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
24af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24b00 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
24b10 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
24b20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
24b30 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
24b40 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
24b50 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
24b60 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
24b70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
24b80 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
24b90 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
24ba0 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
24bb0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
24bc0 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24be0 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
24bf0 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
24c00 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
24c10 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
24c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
24c30 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
24c40 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
24c50 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
24c60 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
24c70 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
24c80 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
24c90 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
24ca0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
24cb0 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
24cc0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
24cd0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
24ce0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
24cf0 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
24d00 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
24d10 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
24d20 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
24d30 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
24d40 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
24d50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24d60 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
24d70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
24d80 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
24d90 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
24da0 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
24db0 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
24dc0 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
24dd0 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
24de0 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
24df0 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
24e00 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
24e10 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
24e20 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
24e30 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
24e40 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
24e50 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
24e60 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
24e70 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
24e80 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
24e90 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
24ea0 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
24eb0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
24ec0 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
24ed0 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
24ee0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
24ef0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
24f00 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
24f10 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
24f20 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
24f30 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
24f40 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
24f50 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
24f60 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
24f70 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
24f80 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Key);.  sqlite3B
24f90 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
24fa0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
24fb0 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
24fc0 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
24fd0 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
24fe0 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
24ff0 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
25000 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33   info.nData==(u3
25010 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20  2)(nData+nZero) 
25020 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
25030 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
25040 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
25050 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
25060 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
25070 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
25080 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
25090 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
250a0 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
250b0 20 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3e 30   .    if( nKey>0
250c0 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
250d0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  y==0 ){.      re
250e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
250f0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  UPT;.    }.    n
25100 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
25110 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
25120 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
25130 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
25140 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
25150 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
25160 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
25170 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
25180 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
25190 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
251a0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
251b0 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
251c0 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
251d0 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
251e0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
251f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
25200 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
25210 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
25220 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
25230 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
25240 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
25250 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
25260 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25270 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
25280 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
25290 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
252a0 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
252b0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
252c0 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
252d0 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
252e0 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
252f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
25300 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
25310 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
25320 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
25330 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
25340 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
25350 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
25360 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
25370 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
25380 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
25390 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
253a0 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
253b0 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
253c0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
253d0 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
253e0 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
253f0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
25400 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
25410 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
25420 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
25430 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
25440 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
25450 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
25460 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
25470 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
25480 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
25490 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
254a0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
254b0 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
254c0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
254d0 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
254e0 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
254f0 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
25500 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
25510 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
25520 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c  ninitialised val
25530 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
25540 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
25550 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
25560 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
25570 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
25580 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
25590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
255a0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
255b0 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
255c0 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
255d0 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
255e0 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  W1);.        rc 
255f0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
25600 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
25610 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20  , pgnoPtrmap);. 
25620 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
25630 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
25640 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
25650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25660 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
25670 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
25680 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
25690 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
256a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
256b0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
256c0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
256d0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
256e0 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
256f0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
25700 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
25710 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
25720 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
25730 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
25740 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
25750 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
25760 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
25770 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
25780 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
25790 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
257a0 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
257b0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
257c0 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
257d0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
257e0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
257f0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
25800 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
25810 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
25820 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
25830 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
25840 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
25850 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
25860 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
25870 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
25880 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
25890 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
258a0 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
258b0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
258c0 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
258d0 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
258e0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
258f0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
25900 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
25910 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
25920 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
25930 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
25940 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
25950 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
25960 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
25970 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
25980 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
25990 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
259a0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
259b0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
259c0 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
259d0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
259e0 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
259f0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
25a00 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
25a10 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
25a20 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
25a30 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
25a40 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
25a50 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
25a60 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
25a70 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
25a80 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
25a90 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
25aa0 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
25ab0 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
25ac0 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
25ad0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
25ae0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
25af0 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
25b00 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
25b10 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
25b20 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
25b30 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
25b40 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
25b50 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
25b60 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
25b70 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
25b80 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
25b90 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
25ba0 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
25bb0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
25bc0 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
25bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
25be0 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
25bf0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
25c00 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
25c10 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
25c20 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
25c30 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
25c40 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
25c50 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
25c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
25c70 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
25c80 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
25c90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
25ca0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
25cb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
25cc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25cd0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
25ce0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
25cf0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
25d00 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
25d10 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
25d20 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
25d30 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
25d40 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
25d50 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
25d60 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
25d70 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
25d80 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
25d90 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
25da0 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
25db0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
25dc0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
25dd0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
25de0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
25df0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
25e00 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
25e10 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  t dropCell(MemPa
25e20 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
25e30 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69  dx, int sz){.  i
25e40 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
25e50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
25e60 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
25e70 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
25e80 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
25e90 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
25ea0 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
25eb0 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
25ec0 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
25ed0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
25ee0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
25ef0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
25f00 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
25f10 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
25f20 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
25f30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
25f40 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
25f50 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
25f60 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
25f70 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
25f80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
25f90 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25fa0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
25fb0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
25fc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25fd0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
25fe0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
25ff0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
26000 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b  ;.  ptr = &data[
26010 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
26020 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63  t + 2*idx];.  pc
26030 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
26040 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50 61 67  ;.  if( (pc<pPag
26050 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
26060 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
26070 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b 73 7a  ).     || (pc+sz
26080 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
26090 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  bleSize) ){.    
260a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
260b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
260c0 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
260d0 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
260e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
260f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
26100 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f 72  rn rc;.  }.  for
26110 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67  (i=idx+1; i<pPag
26120 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70  e->nCell; i++, p
26130 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b  tr+=2){.    ptr[
26140 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20  0] = ptr[2];.   
26150 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d   ptr[1] = ptr[3]
26160 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
26170 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
26180 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
26190 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
261a0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
261b0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
261c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
261d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
261e0 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
261f0 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
26200 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
26210 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
26220 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
26230 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
26240 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
26250 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
26260 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
26270 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
26280 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
26290 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
262a0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
262b0 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
262c0 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
262d0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
262e0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
262f0 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
26300 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
26310 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e  Page->aOvfl[] an
26320 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
26330 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
26340 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
26350 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
26360 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
26370 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
26380 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
26390 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
263a0 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
263b0 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
263c0 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
263d0 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
263e0 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  emented..**.** I
263f0 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  f nSkip is non-z
26400 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ero, then do not
26410 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20   copy the first 
26420 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
26430 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  he.** cell. The 
26440 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72  caller will over
26450 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72  write them after
26460 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
26470 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53  eturns. If.** nS
26480 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
26490 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20   then pCell may 
264a0 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  not point to an 
264b0 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c  invalid memory l
264c0 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74  ocation .** (but
264d0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20   pCell+nSkip is 
264e0 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a  always valid)..*
264f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
26500 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
26510 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
26520 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
26530 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
26540 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
26550 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
26560 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
26570 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
26580 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
26590 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
265a0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
265b0 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
265c0 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
265d0 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
265e0 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
265f0 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
26600 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
26610 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
26620 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
26630 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20   u8 nSkip       
26640 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69     /* Do not wri
26650 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  te the first nSk
26660 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ip bytes of the 
26670 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  cell */.){.  int
26680 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f   idx;          /
26690 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
266a0 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
266b0 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
266c0 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
266d0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
266e0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  er */.  int top;
266f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
26700 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65  st byte of conte
26710 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20  nt for any cell 
26720 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
26730 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
26740 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
26750 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
26760 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
26770 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
26780 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
26790 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
267a0 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
267b0 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
267c0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
267d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
267e0 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66  t into data[] of
267f0 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
26800 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
26810 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
26820 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
26830 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
26840 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
26850 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
26860 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
26870 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
26880 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
26890 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f    /* Used for mo
268a0 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ving information
268b0 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b   around in data[
268c0 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ] */..  assert( 
268d0 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
268e0 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
268f0 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
26900 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
26910 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
26920 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
26930 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
26940 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
26950 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
26960 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
26970 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20  age->aOvfl) );. 
26980 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
26990 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
269a0 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  pCell) );.  asse
269b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
269c0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
269d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
269e0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
269f0 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
26a00 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
26a10 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
26a20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
26a30 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
26a40 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
26a50 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
26a60 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  mp;.    }.    j 
26a70 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
26a80 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
26a90 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
26aa0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
26ab0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
26ac0 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
26ad0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
26ae0 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
26af0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
26b00 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a  ].idx = (u16)i;.
26b10 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
26b20 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
26b30 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
26b40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
26b50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
26b60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
26b80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
26b90 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26ba0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26bb0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
26bc0 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
26bd0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
26be0 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
26bf0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74  hdrOffset;.    t
26c00 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
26c10 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
26c20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
26c30 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
26c40 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
26c50 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
26c60 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20  >nCell + 2;.    
26c70 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
26c80 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20   + 2*i;.    if( 
26c90 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29  end > top - sz )
26ca0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 66  {.      rc = def
26cb0 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
26cc0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
26cd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26ce0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
26cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26d00 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
26d10 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
26d20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
26d30 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  + sz <= top );. 
26d40 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61     }.    idx = a
26d50 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
26d60 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73  ge, sz);.    ass
26d70 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20  ert( idx>0 );.  
26d80 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d    assert( end <=
26d90 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
26da0 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69  hdr+5]) );.    i
26db0 66 20 28 69 64 78 2b 73 7a 20 3e 20 70 50 61 67  f (idx+sz > pPag
26dc0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
26dd0 7a 65 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ze) {.      retu
26de0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
26df0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
26e00 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
26e10 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
26e20 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d  ee -= 2;.    mem
26e30 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
26e40 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
26e50 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
26e60 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70    for(j=end-2, p
26e70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
26e80 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
26e90 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
26ea0 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
26eb0 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
26ec0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
26ed0 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
26ee0 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
26ef0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
26f00 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
26f10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26f20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
26f30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
26f40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
26f50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
26f60 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
26f70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
26f80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
26f90 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
26fa0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
26fb0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
26fc0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
26fd0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
26fe0 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49    */.      CellI
26ff0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
27000 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
27010 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
27020 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
27030 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e       assert( (in
27040 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
27050 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
27060 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
27070 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66  load );.      if
27080 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
27090 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
270a0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
270b0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
270c0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
270d0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
270e0 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
270f0 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
27100 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
27110 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
27120 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27130 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27150 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65  #endif.  }..  re
27160 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27170 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
27180 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
27190 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
271a0 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
271b0 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
271c0 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
271d0 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
271e0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
271f0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
27200 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
27210 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
27220 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
27230 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
27240 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
27250 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
27260 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
27270 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
27280 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
27290 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
272a0 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
272b0 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20  /.  u16 *aSize  
272c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
272d0 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
272e0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
272f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
27300 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
27310 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20  otalSize;    /* 
27320 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Total size of al
27330 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74  l cells */.  int
27340 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
27350 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20  * Index of page 
27360 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
27370 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a  cellptr;      /*
27380 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
27390 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
273a0 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
273b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
273c0 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
273d0 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  y */.  u8 *data;
273e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
273f0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
27400 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
27410 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
27420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27430 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27440 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
27450 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
27460 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
27470 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
27480 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
27490 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35  L(pPage->pBt)<=5
274a0 34 36 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69  460 );.  totalSi
274b0 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ze = 0;.  for(i=
274c0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
274d0 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20  {.    totalSize 
274e0 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d  += aSize[i];.  }
274f0 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c  .  assert( total
27500 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50  Size+2*nCell<=pP
27510 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20  age->nFree );.  
27520 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
27530 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
27540 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
27550 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
27560 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
27570 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67    cellptr = pPag
27580 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
27590 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
275a0 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
275b0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
275c0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
275d0 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
275e0 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a  .  if( nCell ){.
275f0 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61      cellbody = a
27600 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
27610 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a  ge, totalSize);.
27620 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
27630 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73  body>0 );.    as
27640 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
27650 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b  ee >= 2*nCell );
27660 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
27670 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  e -= 2*nCell;.  
27680 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
27690 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
276a0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  put2byte(&data[c
276b0 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64  ellptr], cellbod
276c0 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  y);.      memcpy
276d0 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
276e0 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
276f0 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65  ze[i]);.      ce
27700 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
27710 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53    cellbody += aS
27720 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ize[i];.    }.  
27730 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
27740 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  dy==pPage->pBt->
27750 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
27760 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
27770 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d   = (u16)nCell;.}
27780 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
27790 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
277a0 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
277b0 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
277c0 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
277d0 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
277e0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
277f0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
27800 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
27810 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
27820 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
27830 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
27840 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
27850 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
27860 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
27870 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
27880 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
27890 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
278a0 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
278b0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
278c0 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
278d0 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
278e0 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
278f0 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
27900 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
27910 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
27920 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
27930 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
27940 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
27950 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
27960 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
27970 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
27980 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
27990 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
279a0 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
279b0 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
279c0 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
279d0 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
279e0 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
279f0 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
27a00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
27a10 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
27a20 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
27a30 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
27a40 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
27a50 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
27a60 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
27a70 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  e */../* Forward
27a80 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
27a90 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
27aa0 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29  (BtCursor*, int)
27ab0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
27ac0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
27ad0 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
27ae0 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
27af0 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
27b00 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
27b10 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
27b20 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
27b30 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
27b40 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
27b50 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
27b60 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
27b70 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
27b80 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
27b90 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
27ba0 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
27bb0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
27bc0 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c  ad of trying bal
27bd0 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
27be0 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
27bf0 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
27c00 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
27c10 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
27c20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
27c30 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
27c40 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
27c50 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
27c60 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
27c70 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
27c80 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
27c90 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
27ca0 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
27cb0 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
27cc0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
27cd0 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
27ce0 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
27cf0 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
27d00 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
27d10 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
27d20 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
27d30 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
27d40 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
27d50 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
27d60 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
27d70 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
27d80 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
27d90 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
27da0 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
27db0 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
27dc0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
27dd0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
27de0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
27df0 75 69 63 6b 28 42 74 43 75 72 73 6f 72 20 2a 70  uick(BtCursor *p
27e00 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
27e10 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
27e20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  = 0;.  Pgno pgno
27e30 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  New;.  u8 *pCell
27e40 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a  ;.  u16 szCell;.
27e50 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
27e60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
27e70 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
27e80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
27e90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
27ea0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
27eb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
27ec0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
27ed0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
27ee0 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d   int parentIdx =
27ef0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
27f00 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65     /* pParent ne
27f10 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
27f20 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ndex */.  int pa
27f30 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  rentSize;       
27f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27f50 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64  ize of new divid
27f60 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  er cell */.  u8 
27f70 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20  parentCell[64]; 
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f90 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20  * Space for the 
27fa0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
27fb0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
27fc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27fd0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
27fe0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  tex) );..  /* Al
27ff0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
28000 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76  e. Insert the ov
28010 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d  erflow cell from
28020 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f   pPage.  ** into
28030 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65   it. Then remove
28040 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
28050 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20  ll from pPage.. 
28060 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
28070 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
28080 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
28090 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
280a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
280b0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 50 61  .    pCell = pPa
280c0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
280d0 6c 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d  ll;.    szCell =
280e0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
280f0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
28100 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
28110 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28120 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
28130 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
28140 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  New, pPage->aDat
28150 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d  a[0]);.    assem
28160 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
28170 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
28180 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
28190 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a  verflow = 0;.  .
281a0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20      /* pPage is 
281b0 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69  currently the ri
281c0 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61  ght-child of pPa
281d0 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69  rent. Change thi
281e0 73 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74  s.    ** so that
281f0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
28200 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65   is the new page
28210 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65   allocated above
28220 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50 61 67   and.    ** pPag
28230 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f  e is the next-to
28240 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20  -right child. . 
28250 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e     **.    ** Ign
28260 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ore the return v
28270 61 6c 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c  alue of the call
28280 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29   to fillInCell()
28290 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20  . fillInCell(). 
282a0 20 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72     ** may only r
282b0 65 74 75 72 6e 20 6f 74 68 65 72 20 74 68 61 6e  eturn other than
282c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74   SQLITE_OK if it
282d0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
282e0 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20  allocate.    ** 
282f0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
28300 66 6c 6f 77 20 70 61 67 65 73 2e 20 53 69 6e 63  flow pages. Sinc
28310 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61  e an internal ta
28320 62 6c 65 20 42 2d 54 72 65 65 20 63 65 6c 6c 20  ble B-Tree cell 
28330 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65  .    ** may neve
28340 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74  r spill over ont
28350 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
28360 67 65 20 28 69 74 20 69 73 20 61 20 6d 61 78 69  ge (it is a maxi
28370 6d 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31  mum of .    ** 1
28380 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29  3 bytes in size)
28390 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63  , it is not necc
283a0 65 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20  essary to check 
283b0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  the return code.
283c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
283d0 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e  imilarly, the in
283e0 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e 63 74  sertCell() funct
283f0 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ion cannot fail 
28400 69 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  if the page.    
28410 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  ** being inserte
28420 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64  d into is alread
28430 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74  y writable and t
28440 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
28450 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   .    ** contain
28460 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69   an overflow poi
28470 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20  nter. So ignore 
28480 74 68 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65  this return code
28490 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
284a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
284b0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70  nCell>0 );.    p
284c0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
284d0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
284e0 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  ell-1);.    sqli
284f0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
28500 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
28510 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66  l, &info);.    f
28520 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
28530 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30  t, parentCell, 0
28540 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
28550 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a  0, 0, &parentSiz
28560 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
28570 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b  parentSize<64 );
28580 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
28590 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
285a0 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
285b0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 69 6e  bPage) );.    in
285c0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
285d0 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72  , parentIdx, par
285e0 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53  entCell, parentS
285f0 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  ize, 0, 4);.    
28600 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
28610 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
28620 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50  t,parentIdx), pP
28630 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
28640 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
28650 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
28660 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
28670 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20  pgnoNew);.  .   
28680 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
28690 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
286a0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
286b0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
286c0 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
286d0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
286e0 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
286f0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
28700 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
28710 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
28720 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20 20  rflow page..    
28730 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
28740 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
28750 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
28760 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
28770 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
28780 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
28790 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
287a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
287b0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
287c0 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20  l(pNew, 0);.    
287d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
287e0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
287f0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
28800 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
28810 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
28820 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  );.  }..  /* At 
28830 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
28840 50 61 67 65 2d 3e 6e 46 72 65 65 20 76 61 72 69  Page->nFree vari
28850 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 20  able is not set 
28860 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68 0a 20  correctly with. 
28870 20 2a 2a 20 72 65 73 70 65 63 74 20 74 6f 20 74   ** respect to t
28880 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
28890 65 20 70 61 67 65 20 28 62 65 63 61 75 73 65 20  e page (because 
288a0 69 74 20 77 61 73 20 73 65 74 20 74 6f 20 30 20  it was set to 0 
288b0 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43  by .  ** insertC
288c0 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71  ell). So call sq
288d0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
288e0 67 65 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72  ge() to make sur
288f0 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72  e it is.  ** cor
28900 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rect..  **.  ** 
28910 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 64  This has to be d
28920 6f 6e 65 20 65 76 65 6e 20 69 66 20 61 6e 20 65  one even if an e
28930 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
28940 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  urned. Normally,
28950 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   if.  ** an erro
28960 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
28970 74 72 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20  tree balancing, 
28980 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
28990 4d 65 6d 50 61 67 65 20 61 72 65 0a 20 20 2a 2a  MemPage are.  **
289a0 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20   not important, 
289b0 61 73 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  as they will be 
289c0 72 65 63 61 6c 63 75 6c 61 74 65 64 20 77 68 65  recalculated whe
289d0 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 72 6f  n the page is ro
289e0 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20  lled.  ** back. 
289f0 42 75 74 20 68 65 72 65 2c 20 69 6e 20 62 61 6c  But here, in bal
28a00 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20 69 74  ance_quick(), it
28a10 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
28a20 74 20 70 50 61 67 65 20 68 61 73 20 0a 20 20 2a  t pPage has .  *
28a30 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6d  * not yet been m
28a40 61 72 6b 65 64 20 64 69 72 74 79 20 6f 72 20 77  arked dirty or w
28a50 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
28a60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
28a70 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20  erefore.  ** it 
28a80 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c  will not be roll
28a90 65 64 20 62 61 63 6b 20 61 6e 64 20 73 6f 20 69  ed back and so i
28aa0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
28ab0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
28ac0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 64  .  ** the page d
28ad0 61 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73  ata and contents
28ae0 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65 20   of MemPage are 
28af0 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f  consistent..  */
28b00 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
28b10 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 0;.  sqlite3B
28b20 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
28b30 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge);.  assert( p
28b40 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
28b50 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65  =0 );..  /* If e
28b60 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20 73  verything else s
28b70 75 63 63 65 65 64 65 64 2c 20 62 61 6c 61 6e 63  ucceeded, balanc
28b80 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
28b90 65 2c 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65  e, in .  ** case
28ba0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
28bb0 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65  l inserted cause
28bc0 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f  d it to become o
28bd0 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  verfull..  */.  
28be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28bf0 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  K ){.    release
28c00 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
28c10 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
28c20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
28c30 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  (pCur, 0);.  }. 
28c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
28c50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
28c60 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
28c70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
28c80 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
28c90 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70  butes Cells on p
28ca0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
28cb0 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  N*2 siblings.** 
28cc0 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74  of pPage so that
28cd0 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
28ce0 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61  about the same a
28cf0 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
28d00 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ace..** Usually 
28d10 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
28d20 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
28d30 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74  age is used in t
28d40 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a  he balancing,.**
28d50 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62   though more sib
28d60 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
28d70 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69   from one side i
28d80 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66  f pPage is the f
28d90 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20  irst.** or last 
28da0 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
28db0 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68  ent.  If pPage h
28dc0 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a  as fewer than 2*
28dd0 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28  NN siblings.** (
28de0 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
28df0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
28e00 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
28e10 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a  root page or a .
28e20 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74  ** child of root
28e30 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
28e40 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61  able siblings pa
28e50 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
28e60 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
28e70 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
28e80 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
28e90 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
28ea0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
28eb0 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74  d by one or.** t
28ec0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
28ed0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
28ee0 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
28ef0 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65  t over full. The
28f00 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
28f10 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20   special and is 
28f20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65  allowed to be ne
28f30 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70  arly empty. If p
28f40 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20  Page is .** the 
28f50 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
28f60 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
28f70 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69   tree might be i
28f80 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64  ncreased.** or d
28f90 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c  ecreased by one,
28fa0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74   as necessary, t
28fb0 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20  o keep the root 
28fc0 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a  page from being.
28fd0 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63  ** overfull or c
28fe0 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
28ff0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
29000 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
29010 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
29020 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20  me of the Cells 
29030 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  on pPage.** migh
29040 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
29050 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  e stored in pPag
29060 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69  e->aData[].  Thi
29070 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
29080 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
29090 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f  verfull.  Part o
290a0 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  f the job of thi
290b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a  s routine is to.
290c0 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** make sure all
290d0 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65   Cells for pPage
290e0 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20   once again fit 
290f0 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
29100 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  ]..**.** In the 
29110 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
29120 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ing the siblings
29130 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70   of pPage, the p
29140 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a  arent of pPage.*
29150 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f  * might become o
29160 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
29170 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68  full.  If that h
29180 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69  appens, then thi
29190 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
291a0 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
291b0 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ly on the parent
291c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
291d0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
291e0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
291f0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
29200 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
29210 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
29220 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
29230 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
29240 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
29250 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
29260 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
29270 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
29280 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
29290 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
292a0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
292b0 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f     /* The over o
292c0 72 20 75 6e 64 65 72 66 75 6c 6c 20 70 61 67 65  r underfull page
292d0 20 74 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20   to balance */. 
292e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
292f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
29300 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   The parent of p
29310 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  Page */.  BtShar
29320 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
29330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
29340 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
29350 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29370 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
29380 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
29390 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
293a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
293b0 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
293c0 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
293d0 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
293e0 20 69 6e 74 20 6e 4f 6c 64 20 3d 20 30 3b 20 20   int nOld = 0;  
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29400 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
29410 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
29420 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20   int nNew = 0;  
29430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29440 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
29450 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
29460 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20   int nDiv;      
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29480 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
29490 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20   in apDiv[] */. 
294a0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
294b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
294c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
294d0 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  /.  int idx;    
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294f0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61   /* Index of pPa
29500 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ge in pParent->a
29510 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
29520 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
29530 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
29540 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
29550 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
29560 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29580 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
29590 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
295a0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
295b0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
295c0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
295d0 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
295e0 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29600 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
29610 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
29620 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
29630 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
29640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29650 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
29660 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
29670 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
29680 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
29690 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
296a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
296b0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
296c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
296d0 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
296e0 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
296f0 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
29700 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
29710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29720 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
29730 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
29740 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32  */.  int iSpace2
29750 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29760 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
29770 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
29780 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  2[] */.  int szS
29790 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
297a0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
297b0 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
297c0 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
297d0 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
297e0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
297f0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
29800 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
29810 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42   Pgno pgnoOld[NB
29820 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
29830 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
29840 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
29850 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  pOld[] */.  MemP
29860 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
29870 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
29880 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
29890 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
298a0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
298b0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
298c0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
298d0 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
298e0 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
298f0 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e    Pgno pgnoNew[N
29900 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  B+2];          /
29910 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
29920 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
29930 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20  apNew[] */.  u8 
29940 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20  *apDiv[NB];     
29950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
29960 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
29970 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
29980 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
29990 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
299a0 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
299b0 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
299c0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
299d0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
299e0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
299f0 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
29a00 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
29a10 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
29a20 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
29a30 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
29a40 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
29a50 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
29a60 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
29a70 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
29a80 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
29a90 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
29aa0 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20  8 *aCopy[NB];   
29ab0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
29ac0 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  or holding data 
29ad0 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20  of apCopy[] */. 
29ae0 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20   u8 *aSpace1;   
29af0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
29b00 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64   for copies of d
29b10 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65  ividers cells be
29b20 66 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a  fore balance */.
29b30 20 20 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20    u8 *aSpace2 = 
29b40 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63  0;       /* Spac
29b50 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64  e for overflow d
29b60 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66  ividers cells af
29b70 74 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20  ter balance */. 
29b80 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a   u8 *aFrom = 0;.
29b90 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
29ba0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29bb0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
29bc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29bd0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
29be0 75 74 65 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f  utex) );.  VVA_O
29bf0 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73  NLY( pCur->pages
29c00 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a  Shuffled = 1 );.
29c10 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64  .  /* .  ** Find
29c20 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
29c30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
29c40 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
29c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29c60 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
29c70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
29c80 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
29c90 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c  Page->pDbPage) |
29ca0 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
29cb0 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d  ow==1 );.  pBt =
29cc0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70   pPage->pBt;.  p
29cd0 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
29ce0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29cf0 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e-1];.  assert( 
29d00 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28  pParent );.  if(
29d10 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
29d20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29d30 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ite(pParent->pDb
29d40 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f  Page)) ){.    go
29d50 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
29d60 75 70 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45  up;.  }..  TRACE
29d70 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
29d80 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
29d90 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
29da0 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
29db0 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  pgno));..#ifndef
29dc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
29dd0 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20  CKBALANCE.  /*. 
29de0 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61   ** A special ca
29df0 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e  se:  If a new en
29e00 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  try has just bee
29e10 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
29e20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68  a.  ** table (th
29e30 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77  at is, a btree w
29e40 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ith integer keys
29e50 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74   and all data at
29e60 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a   the leaves).  *
29e70 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e  * and the new en
29e80 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
29e90 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
29ea0 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
29eb0 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
29ec0 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
29ed0 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
29ee0 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
29ef0 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
29f00 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
29f10 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
29f20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
29f30 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
29f40 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
29f50 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
29f60 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
29f70 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
29f80 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
29f90 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
29fa0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29fb0 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61  ==1 &&.      pPa
29fc0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
29fd0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  ==pPage->nCell &
29fe0 26 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  &.      pParent-
29ff0 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
2a000 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
2a010 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2a020 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2a030 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
2a040 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2a050 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
2a060 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
2a070 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73  ODO: Check the s
2a080 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c  iblings to the l
2a090 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74  eft of pPage. It
2a0a0 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20   may be that.   
2a0b0 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74   ** they are not
2a0c0 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77   full and no new
2a0d0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2a0e0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  d..    */.    re
2a0f0 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69  turn balance_qui
2a100 63 6b 28 70 43 75 72 29 3b 0a 20 20 7d 0a 23 65  ck(pCur);.  }.#e
2a110 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49  ndif..  if( SQLI
2a120 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
2a130 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a140 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20  Page->pDbPage)) 
2a150 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  ){.    goto bala
2a160 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2a170 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
2a180 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65   the cell in the
2a190 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f   parent page who
2a1a0 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f  se left child po
2a1b0 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74  ints back.  ** t
2a1c0 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69  o pPage.  The "i
2a1d0 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20  dx" variable is 
2a1e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
2a1f0 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67  t cell.  If pPag
2a200 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69  e.  ** is the ri
2a210 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ghtmost child of
2a220 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65   pParent then se
2a230 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74  t idx to pParent
2a240 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20  ->nCell .  */.  
2a250 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
2a260 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2a270 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
2a280 49 6e 64 65 78 28 70 50 61 72 65 6e 74 2c 20 69  Index(pParent, i
2a290 64 78 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  dx, pPage->pgno)
2a2a0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
2a2b0 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  d sibling pages 
2a2c0 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65  to pPage and the
2a2d0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
2a2e0 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20  t that divide.  
2a2f0 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  ** the siblings.
2a300 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20    An attempt is 
2a310 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
2a320 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
2a330 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20  er.  ** side of 
2a340 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62  pPage.  More sib
2a350 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
2a360 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
2a370 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20  owever, if.  ** 
2a380 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20  pPage there are 
2a390 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
2a3a0 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
2a3b0 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50  her side.  If pP
2a3c0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
2a3d0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
2a3e0 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
2a3f0 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
2a400 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f   are taken..  */
2a410 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d  .  nxDiv = idx -
2a420 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76   NN;.  if( nxDiv
2a430 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d   + NB > pParent-
2a440 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78  >nCell ){.    nx
2a450 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Div = pParent->n
2a460 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20  Cell - NB + 1;. 
2a470 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30   }.  if( nxDiv<0
2a480 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
2a490 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20  0;.  }.  nDiv = 
2a4a0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d  0;.  for(i=0, k=
2a4b0 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b  nxDiv; i<NB; i++
2a4c0 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , k++){.    if( 
2a4d0 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  k<pParent->nCell
2a4e0 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
2a4f0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
2a500 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20  arent, k);.     
2a510 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61   nDiv++;.      a
2a520 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d  ssert( !pParent-
2a530 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70  >leaf );.      p
2a540 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
2a550 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
2a560 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d      }else if( k=
2a570 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
2a580 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  ){.      pgnoOld
2a590 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26  [i] = get4byte(&
2a5a0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2a5b0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2a5c0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
2a5d0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
2a5e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
2a5f0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
2a600 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61  , pgnoOld[i], &a
2a610 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
2a620 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2a630 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2a640 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64   /* apOld[i]->id
2a650 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a  xParent = k; */.
2a660 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20      apCopy[i] = 
2a670 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  0;.    assert( i
2a680 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f  ==nOld );.    nO
2a690 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65  ld++;.    nMaxCe
2a6a0 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
2a6b0 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
2a6c0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
2a6d0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
2a6e0 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
2a6f0 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
2a700 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
2a710 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
2a720 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
2a730 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
2a740 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
2a750 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
2a760 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
2a770 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a  ctures.  */.  sz
2a780 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
2a790 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2a7a0 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a7c0 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
2a7d0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2a7e0 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a800 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
2a810 20 28 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28   (ROUND8(sizeof(
2a820 4d 65 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e 70  MemPage))+pBt->p
2a830 61 67 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20  ageSize)*NB  /* 
2a840 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20  aCopy */.     + 
2a850 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
2a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2a880 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
2a890 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f   (ISAUTOVACUUM ?
2a8a0 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b   nMaxCells : 0);
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a8c0 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c  aFrom */.  apCel
2a8d0 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
2a8e0 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
2a8f0 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
2a900 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
2a910 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2a920 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
2a930 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2a940 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
2a950 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
2a960 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20  ls];.  aCopy[0] 
2a970 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
2a980 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
2a990 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2a9a0 41 4c 49 47 4e 4d 45 4e 54 28 61 43 6f 70 79 5b  ALIGNMENT(aCopy[
2a9b0 30 5d 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31  0]) );.  for(i=1
2a9c0 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<NB; i++){.  
2a9d0 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43    aCopy[i] = &aC
2a9e0 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61  opy[i-1][pBt->pa
2a9f0 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
2aa00 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
2aa10 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61  .    assert( ((a
2aa20 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 30  Copy[i] - (u8*)0
2aa30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
2aa40 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
2aa50 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d   required */.  }
2aa60 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61 43  .  aSpace1 = &aC
2aa70 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70  opy[NB-1][pBt->p
2aa80 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
2aa90 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
2aaa0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2aab0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2aac0 28 61 53 70 61 63 65 31 29 20 29 3b 0a 20 20 69  (aSpace1) );.  i
2aad0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2aae0 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26  ){.    aFrom = &
2aaf0 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
2ab00 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53  eSize];.  }.  aS
2ab10 70 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50  pace2 = sqlite3P
2ab20 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70  ageMalloc(pBt->p
2ab30 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
2ab40 61 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20  aSpace2==0 ){.  
2ab50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2ab60 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
2ab70 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2ab80 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
2ab90 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
2aba0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50  he content of pP
2abb0 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
2abc0 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d  ings into aOld[]
2abd0 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20  ..  ** The rest 
2abe0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2abf0 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
2ac00 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
2ac10 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ather.  ** that 
2ac20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2ac30 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
2ac40 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
2ac50 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20   be in the.  ** 
2ac60 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
2ac70 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20   overwritten..  
2ac80 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2ac90 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
2aca0 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43  MemPage *p = apC
2acb0 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
2acc0 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20  e*)aCopy[i];.   
2acd0 20 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64   memcpy(p, apOld
2ace0 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
2acf0 61 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44  age));.    p->aD
2ad00 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b  ata = (void*)&p[
2ad10 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2ad20 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
2ad30 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
2ad40 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
2ad50 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
2ad60 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
2ad70 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
2ad80 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
2ad90 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
2ada0 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
2adb0 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
2adc0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
2add0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2ade0 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
2adf0 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61   obtained form a
2ae00 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d  Space1[] and rem
2ae10 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69  ove the the divi
2ae20 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66  der Cells.  ** f
2ae30 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
2ae40 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
2ae50 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
2ae60 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
2ae70 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
2ae80 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
2ae90 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
2aea0 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
2aeb0 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
2aec0 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
2aed0 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31   ** into aSpace1
2aee0 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
2aef0 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
2af00 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
2af10 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
2af20 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
2af30 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
2af40 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
2af50 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
2af60 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
2af70 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
2af80 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
2af90 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
2afa0 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
2afb0 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
2afc0 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
2afd0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
2afe0 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
2aff0 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
2b000 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
2b010 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
2b020 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
2b030 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
2b040 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
2b050 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61  nCell = 0;.  lea
2b060 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50  fCorrection = pP
2b070 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  age->leaf*4;.  l
2b080 65 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d  eafData = pPage-
2b090 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
2b0a0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2b0b0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
2b0c0 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
2b0d0 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20  ;.    int limit 
2b0e0 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
2b0f0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
2b100 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
2b110 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
2b120 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
2b130 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2b140 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
2b150 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
2b160 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20  ll(pOld, j);.   
2b170 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2b180 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2b190 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c  Old, apCell[nCel
2b1a0 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  l]);.      if( I
2b1b0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2b1c0 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20         int a;.  
2b1d0 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
2b1e0 6c 5d 20 3d 20 28 75 38 29 69 3b 20 20 20 61 73  l] = (u8)i;   as
2b1f0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
2b200 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  6 );.        for
2b210 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f  (a=0; a<pOld->nO
2b220 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20  verflow; a++){. 
2b230 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c           if( pOl
2b240 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c  d->aOvfl[a].pCel
2b250 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  l==apCell[nCell]
2b260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b270 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30  aFrom[nCell] = 0
2b280 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xFF;.           
2b290 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2b2a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2b2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
2b2c0 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  l++;.    }.    i
2b2d0 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20  f( i<nOld-1 ){. 
2b2e0 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63 65       u16 sz = ce
2b2f0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
2b300 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
2b310 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
2b320 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
2b330 69 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41  ith the LEAFDATA
2b340 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63   flag, pParent c
2b350 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49  ells hold only I
2b360 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20  NTKEYs that.    
2b370 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69      ** are dupli
2b380 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e  cates of keys on
2b390 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
2b3a0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65  .  We need to re
2b3b0 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  move.        ** 
2b3c0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2b3d0 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20  s from pParent, 
2b3e0 62 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73  but the dividers
2b3f0 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20   cells are not. 
2b400 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
2b410 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61  to apCell[] beca
2b420 75 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70  use they are dup
2b430 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64  licates of child
2b440 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20   cells..        
2b450 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  */.        dropC
2b460 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
2b470 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d  iv, sz);.      }
2b480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38  else{.        u8
2b490 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20   *pTemp;.       
2b4a0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
2b4b0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2b4c0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2b4d0 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20  ] = sz;.        
2b4e0 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
2b4f0 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
2b500 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a     iSpace1 += sz
2b510 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2b520 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
2b530 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 20  ize/4 );.       
2b540 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31   assert( iSpace1
2b550 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
2b560 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
2b570 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
2b580 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  ], sz);.        
2b590 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
2b5a0 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
2b5b0 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  tion;.        if
2b5c0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2b5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f  {.          aFro
2b5e0 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
2b5f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b600 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
2b610 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b  ent, nxDiv, sz);
2b620 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b630 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2b640 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63  =0 || leafCorrec
2b650 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
2b660 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2b670 20 2d 3d 20 28 75 31 36 29 6c 65 61 66 43 6f 72   -= (u16)leafCor
2b680 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
2b690 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
2b6a0 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c  e(pTemp)==pgnoOl
2b6b0 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  d[i] );.        
2b6c0 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
2b6d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
2b6e0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
2b6f0 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
2b700 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
2b710 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
2b720 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
2b730 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
2b740 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2b750 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
2b760 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
2b770 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
2b780 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
2b790 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e  ld->aData[pOld->
2b7a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29  hdrOffset+8], 4)
2b7b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2b7c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b7d0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
2b7e0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
2b7f0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
2b800 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
2b810 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
2b820 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
2b830 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
2b840 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
2b850 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2b860 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  ] = 4;.         
2b870 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2b880 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
2b890 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2b8a0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
2b8b0 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
2b8c0 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
2b8d0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
2b8e0 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
2b8f0 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
2b900 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
2b910 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
2b920 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
2b930 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
2b940 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
2b950 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
2b960 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
2b970 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
2b980 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
2b990 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
2b9a0 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
2b9b0 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
2b9c0 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
2b9d0 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
2b9e0 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
2b9f0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
2ba00 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
2ba10 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
2ba20 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2ba30 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
2ba40 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
2ba50 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
2ba60 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
2ba70 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
2ba80 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
2ba90 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
2baa0 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
2bab0 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
2bac0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
2bad0 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
2bae0 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
2baf0 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
2bb00 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
2bb10 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2bb20 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
2bb30 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
2bb40 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
2bb50 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
2bb60 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
2bb70 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2bb80 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
2bb90 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
2bba0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
2bbb0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2bbc0 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
2bbd0 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
2bbe0 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
2bbf0 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
2bc00 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
2bc10 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
2bc20 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
2bc30 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
2bc40 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2bc50 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
2bc60 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
2bc70 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    k++;.    }.  }
2bc80 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
2bc90 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
2bca0 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
2bcb0 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
2bcc0 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
2bcd0 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
2bce0 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
2bcf0 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
2bd00 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
2bd10 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
2bd20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
2bd30 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
2bd40 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
2bd50 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
2bd60 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
2bd70 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
2bd80 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
2bd90 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
2bda0 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
2bdb0 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
2bdc0 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
2bdd0 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
2bde0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
2bdf0 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
2be00 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
2be10 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
2be20 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
2be30 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
2be40 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
2be50 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
2be60 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
2be70 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
2be80 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
2be90 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
2bea0 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
2beb0 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
2bec0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
2bed0 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
2bee0 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
2bef0 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
2bf00 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
2bf10 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
2bf20 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
2bf30 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
2bf40 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
2bf50 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
2bf60 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
2bf70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2bf80 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
2bf90 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
2bfa0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
2bfb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2bfc0 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
2bfd0 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
2bfe0 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
2bff0 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
2c000 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
2c010 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
2c020 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
2c030 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
2c040 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
2c050 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
2c060 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
2c070 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
2c080 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
2c090 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
2c0a0 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
2c0b0 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
2c0c0 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
2c0d0 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
2c0e0 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
2c0f0 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
2c100 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
2c110 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
2c120 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
2c130 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
2c140 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
2c150 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
2c160 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
2c170 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
2c180 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
2c190 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
2c1a0 30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65  0) or we are the
2c1b0 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
2c1c0 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
2c1d0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
2c1e0 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
2c1f0 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
2c200 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
2c210 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
2c220 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
2c230 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2c240 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
2c250 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
2c260 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
2c270 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  ell==0) );..  /*
2c280 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
2c290 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
2c2a0 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
2c2b0 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
2c2c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2c2d0 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
2c2e0 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65  ageFlags = pPage
2c2f0 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
2c300 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
2c310 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
2c320 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
2c330 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
2c340 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
2c350 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pOld[i];.      p
2c360 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
2c370 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
2c380 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
2c390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2c3a0 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
2c3b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
2c3c0 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
2c3d0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2c3e0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2c3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2c400 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
2c410 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2c420 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2c430 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d  New, &pgnoNew[i]
2c440 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20  , pgnoNew[i-1], 
2c450 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2c460 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
2c470 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
2c480 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
2c490 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
2c4a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
2c4b0 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
2c4c0 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
2c4d0 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
2c4e0 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
2c4f0 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
2c500 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70  rc = freePage(ap
2c510 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
2c520 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2c530 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2c540 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
2c550 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
2c560 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
2c570 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
2c580 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
2c590 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
2c5a0 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
2c5b0 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
2c5c0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
2c5d0 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
2c5e0 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
2c5f0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
2c600 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
2c610 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
2c620 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
2c630 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
2c640 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
2c650 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
2c660 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
2c670 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
2c680 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
2c690 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
2c6a0 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
2c6b0 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
2c6c0 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
2c6d0 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
2c6e0 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
2c6f0 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
2c700 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
2c710 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
2c720 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
2c730 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
2c740 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
2c750 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
2c760 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
2c770 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
2c780 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
2c790 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
2c7a0 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
2c7b0 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70      int minV = p
2c7c0 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69  gnoNew[i];.    i
2c7d0 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
2c7e0 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
2c7f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
2c800 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73   pgnoNew[j]<(uns
2c810 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20  igned)minV ){.  
2c820 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a        minI = j;.
2c830 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70          minV = p
2c840 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20  gnoNew[j];.     
2c850 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2c860 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
2c870 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65   int t;.      Me
2c880 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
2c890 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b   t = pgnoNew[i];
2c8a0 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
2c8b0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  w[i];.      pgno
2c8c0 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77  New[i] = pgnoNew
2c8d0 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70  [minI];.      ap
2c8e0 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d  New[i] = apNew[m
2c8f0 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  inI];.      pgno
2c900 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20  New[minI] = t;. 
2c910 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d       apNew[minI]
2c920 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pT;.    }.  }
2c930 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2c940 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
2c950 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25  d  new: %d(%d) %
2c960 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
2c970 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
2c980 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a     pgnoOld[0], .
2c990 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67      nOld>=2 ? pg
2c9a0 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20  noOld[1] : 0,.  
2c9b0 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f    nOld>=3 ? pgno
2c9c0 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[2] : 0,.    
2c9d0 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65  pgnoNew[0], szNe
2c9e0 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
2c9f0 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a  2 ? pgnoNew[1] :
2ca00 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a   0, nNew>=2 ? sz
2ca10 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  New[1] : 0,.    
2ca20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65  nNew>=3 ? pgnoNe
2ca30 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[2] : 0, nNew>=
2ca40 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30  3 ? szNew[2] : 0
2ca50 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20  ,.    nNew>=4 ? 
2ca60 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20  pgnoNew[3] : 0, 
2ca70 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
2ca80 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
2ca90 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d  >=5 ? pgnoNew[4]
2caa0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
2cab0 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
2cac0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c  .  /*.  ** Evenl
2cad0 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65  y distribute the
2cae0 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b   data in apCell[
2caf0 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77  ] across the new
2cb00 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73   pages..  ** Ins
2cb10 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ert divider cell
2cb20 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61  s into pParent a
2cb30 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
2cb40 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  j = 0;.  for
2cb50 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2cb60 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d  +){.    /* Assem
2cb70 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c  ble the new sibl
2cb80 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
2cb90 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
2cba0 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61   apNew[i];.    a
2cbb0 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
2cbc0 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ls );.    assert
2cbd0 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67  ( pNew->pgno==pg
2cbe0 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20  noNew[i] );.    
2cbf0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
2cc00 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61  ageFlags);.    a
2cc10 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
2cc20 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
2cc30 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
2cc40 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
2cc50 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
2cc60 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
2cc70 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
2cc80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
2cc90 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
2cca0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   );..    /* If t
2ccb0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2ccc0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2ccd0 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2cce0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er map entries. 
2ccf0 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74     ** that point
2cd00 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73   to the siblings
2cd10 20 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72   that were rearr
2cd20 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e  anged. These can
2cd30 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a   be: left.    **
2cd40 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c   children of cel
2cd50 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68  ls, the right-ch
2cd60 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c  ild of the page,
2cd70 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
2cd80 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  es.    ** pointe
2cd90 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20  d to by cells.. 
2cda0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
2cdb0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2cdc0 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63      for(k=j; k<c
2cdd0 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a  ntNew[i]; k++){.
2cde0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cdf0 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  k<nMaxCells );. 
2ce00 20 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d         if( aFrom
2ce10 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43  [k]==0xFF || apC
2ce20 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70  opy[aFrom[k]]->p
2ce30 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
2ce40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2ce50 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
2ce60 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20  pNew, k-j);.    
2ce70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2ce80 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43  LITE_OK && leafC
2ce90 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a  orrection==0 ){.
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2ceb0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2cec0 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b  get4byte(apCell[
2ced0 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  k]), PTRMAP_BTRE
2cee0 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  E, pNew->pgno);.
2cef0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cf00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2cf10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cf20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2cf30 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2cf40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cf50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2cf60 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77  ..    j = cntNew
2cf70 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  [i];..    /* If 
2cf80 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
2cf90 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
2cfa0 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67   was not the rig
2cfb0 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c  ht-most sibling,
2cfc0 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61  .    ** insert a
2cfd0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
2cfe0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2cff0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
2d000 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a  f( i<nNew-1 && j
2d010 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  <nCell ){.      
2d020 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
2d030 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
2d040 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20    int sz;..     
2d050 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
2d060 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43  ells );.      pC
2d070 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b  ell = apCell[j];
2d080 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65  .      sz = szCe
2d090 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72  ll[j] + leafCorr
2d0a0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54  ection;.      pT
2d0b0 65 6d 70 20 3d 20 26 61 53 70 61 63 65 32 5b 69  emp = &aSpace2[i
2d0c0 53 70 61 63 65 32 5d 3b 0a 20 20 20 20 20 20 69  Space2];.      i
2d0d0 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
2d0e0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
2d0f0 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
2d100 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
2d110 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
2d120 41 43 55 55 4d 20 0a 20 20 20 20 20 20 20 20 20  ACUUM .         
2d130 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78  && (aFrom[j]==0x
2d140 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72  FF || apCopy[aFr
2d150 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e  om[j]]->pgno!=pN
2d160 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20  ew->pgno).      
2d170 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
2d180 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2d190 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
2d1a0 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  l), PTRMAP_BTREE
2d1b0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20  , pNew->pgno);. 
2d1c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2d1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d1e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
2d1f0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2d200 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d210 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2d220 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
2d230 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2d240 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
2d250 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
2d260 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
2d270 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
2d280 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
2d290 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
2d2a0 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
2d2b0 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
2d2c0 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
2d2d0 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
2d2e0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
2d2f0 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
2d300 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
2d310 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
2d320 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
2d330 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
2d340 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2d350 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
2d360 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
2d370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d380 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
2d390 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
2d3a0 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
2d3b0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
2d3c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
2d3d0 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
2d3e0 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66  t, pCell, 0, inf
2d3f0 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c  o.nKey, 0, 0, 0,
2d400 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69   &sz);.        i
2d410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2d430 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2d440 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
2d450 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
2d460 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2d470 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
2d480 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
2d490 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
2d4a0 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
2d4b0 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
2d4c0 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
2d4d0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
2d4e0 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
2d4f0 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
2d500 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
2d510 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
2d520 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
2d530 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
2d540 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
2d550 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
2d560 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e sqlite3BtreePa
2d570 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
2d580 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
2d590 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
2d5a0 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
2d5b0 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
2d5c0 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
2d5d0 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
2d5e0 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
2d5f0 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
2d600 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
2d610 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
2d620 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
2d630 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
2d640 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
2d650 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
2d660 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
2d670 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
2d680 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
2d690 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
2d6a0 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
2d6b0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
2d6c0 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
2d6d0 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
2d6e0 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
2d6f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d700 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
2d710 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
2d720 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
2d730 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
2d740 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
2d750 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2d760 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
2d770 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2d780 69 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20  iSpace2 += sz;. 
2d790 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
2d7a0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
2d7b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2d7c0 28 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e  ( iSpace2<=pBt->
2d7d0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
2d7e0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
2d7f0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2d800 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
2d810 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66  mp, 4);.      if
2d820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d830 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2d840 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
2d850 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2d860 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2d870 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
2d880 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
2d890 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
2d8a0 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76  ll(pParent,nxDiv
2d8b0 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  ), pNew->pgno);.
2d8c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
2d8d0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2d8e0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e  uum database, an
2d8f0 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74  d not a leaf-dat
2d900 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a  a tree,.      **
2d910 20 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65   then update the
2d920 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74   pointer map wit
2d930 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  h an entry for t
2d940 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2d950 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
2d960 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73  he cell just ins
2d970 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20  erted points to 
2d980 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20  (if any)..      
2d990 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
2d9a0 55 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65  UTOVACUUM && !le
2d9b0 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
2d9c0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2d9d0 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
2d9e0 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
2d9f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2da00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2da10 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2da20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2da30 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a     }.      j++;.
2da40 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
2da50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
2da60 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2da70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e   entry for the n
2da80 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
2da90 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2daa0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2dab0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2dac0 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
2dad0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2dae0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
2daf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2db00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2db10 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2db20 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2db30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2db40 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
2db50 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
2db60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
2db70 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
2db80 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
2db90 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
2dba0 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
2dbb0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
2dbc0 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
2dbd0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
2dbe0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
2dbf0 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28  ild, 4);.    if(
2dc00 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2dc10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2dc20 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
2dc30 79 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52  yte(zChild), PTR
2dc40 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
2dc50 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
2dc60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2dc70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dc80 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2dc90 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2dca0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
2dcb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2dcc0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2dcd0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
2dce0 29 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d  );.  if( nxDiv==
2dcf0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70  pParent->nCell+p
2dd00 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2dd10 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  w ){.    /* Righ
2dd20 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
2dd30 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2dd40 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2dd50 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  t */.    put4byt
2dd60 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2dd70 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2dd80 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
2dd90 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c  [nNew-1]);.  }el
2dda0 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74  se{.    /* Right
2ddb0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
2ddc0 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
2ddd0 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  of the first ent
2dde0 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20  ry in pParent.  
2ddf0 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69    ** past the ri
2de00 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72  ght-most divider
2de10 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75   entry */.    pu
2de20 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2de30 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
2de40 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77   nxDiv), pgnoNew
2de50 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a  [nNew-1]);.  }..
2de60 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63    /*.  ** Balanc
2de70 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2de80 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
2de90 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28  e current page (
2dea0 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a  pPage) might.  *
2deb0 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  * have been adde
2dec0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2ded0 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f  t so it might no
2dee0 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69   longer be initi
2def0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74  alized..  ** But
2df00 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2df10 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
2df20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2df30 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
2df40 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ent->isInit );. 
2df50 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
2df60 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61  ree(apCell);.  a
2df70 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 54 52 41  pCell = 0;.  TRA
2df80 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
2df90 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20  nished with %d: 
2dfa0 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
2dfb0 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
2dfc0 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
2dfd0 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43  , nOld, nNew, nC
2dfe0 65 6c 6c 29 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ell));.  pPage->
2dff0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
2e000 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2e010 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ge);.  pCur->iPa
2e020 67 65 2d 2d 3b 0a 20 20 72 63 20 3d 20 62 61 6c  ge--;.  rc = bal
2e030 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20  ance(pCur, 0);. 
2e040 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61   .  /*.  ** Clea
2e050 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
2e060 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
2e070 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
2e080 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 61 53  lite3PageFree(aS
2e090 70 61 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65  pace2);.  sqlite
2e0a0 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
2e0b0 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
2e0c0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
2e0d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
2e0e0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
2e0f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
2e100 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
2e110 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
2e120 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 70  ;.  }.  pCur->ap
2e130 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2e140 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  ]->nOverflow = 0
2e150 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
2e160 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2e170 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2e180 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
2e190 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65  e of a btree whe
2e1a0 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  n the root.** pa
2e1b0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
2e1c0 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61  ells.  This is a
2e1d0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
2e1e0 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a   make the tree.*
2e1f0 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f  * shallower by o
2e200 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ne level..*/.sta
2e210 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2e220 73 68 61 6c 6c 6f 77 65 72 28 42 74 43 75 72 73  shallower(BtCurs
2e230 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2e240 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
2e250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
2e260 74 20 70 61 67 65 20 6f 66 20 42 2d 54 72 65 65  t page of B-Tree
2e270 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2e280 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
2e290 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63     /* The only c
2e2a0 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61  hild page of pPa
2e2b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
2e2c0 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
2e2d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2e2e0 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a  ber for pChild *
2e2f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2e300 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2e310 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2e320 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
2e330 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  es */.  BtShared
2e340 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
2e350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
2e360 61 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74  ain BTree struct
2e370 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43  ure */.  int mxC
2e380 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20  ellPerPage;     
2e390 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2e3a0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2e3b0 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75   per page */.  u
2e3c0 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2e3e0 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61  ll cells from pa
2e3f0 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ges being balanc
2e400 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
2e410 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2e420 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
2e430 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
2e440 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
2e450 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a  ur->iPage==0 );.
2e460 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2e470 61 70 50 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73  apPage[0];..  as
2e480 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2e490 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2e4a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2e4b0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2e4c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42  ->mutex) );.  pB
2e4d0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2e4e0 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20    mxCellPerPage 
2e4f0 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a  = MX_CELL(pBt);.
2e500 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
2e510 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c  e3Malloc( mxCell
2e520 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28  PerPage*(sizeof(
2e530 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29  u8*)+sizeof(u16)
2e540 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c  ) );.  if( apCel
2e550 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2e560 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a  LITE_NOMEM;.  sz
2e570 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
2e580 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61  Cell[mxCellPerPa
2e590 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ge];.  if( pPage
2e5a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  ->leaf ){.    /*
2e5b0 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f   The table is co
2e5c0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a  mpletely empty *
2e5d0 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41  /.    TRACE(("BA
2e5e0 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62  LANCE: empty tab
2e5f0 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  le %d\n", pPage-
2e600 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
2e610 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
2e620 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20  t page is empty 
2e630 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c  but has one chil
2e640 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  d.  Transfer the
2e650 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
2e660 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e  ion from that on
2e670 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65  e child into the
2e680 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74   root page if it
2e690 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69   .    ** will fi
2e6a0 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  t.  This reduces
2e6b0 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
2e6c0 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20  e tree by one.. 
2e6d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2e6e0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
2e6f0 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20   page 1, it has 
2e700 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c  less space avail
2e710 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  able than.    **
2e720 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20   its child (due 
2e730 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20  to the 100 byte 
2e740 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75  header that occu
2e750 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  rs at the beginn
2e760 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ing.    ** of th
2e770 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c  e database fle),
2e780 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74   so it might not
2e790 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64   be able to hold
2e7a0 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20   all of the .   
2e7b0 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
2e7c0 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
2e7d0 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64  ned in the child
2e7e0 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
2e7f0 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20  e .    ** case, 
2e800 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74  then do not do t
2e810 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65  he transfer.  Le
2e820 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79  ave page 1 empty
2e830 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
2e840 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
2e850 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c  nter to the chil
2e860 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69  d page.  The chi
2e870 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a  ld page becomes.
2e880 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75      ** the virtu
2e890 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  al root of the t
2e8a0 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ree..    */.    
2e8b0 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
2e8c0 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
2e8d0 31 20 29 3b 0a 20 20 20 20 70 67 6e 6f 43 68 69  1 );.    pgnoChi
2e8e0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
2e8f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2e900 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2e910 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
2e920 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20  noChild>0 );.   
2e930 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
2e940 6c 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75  ld<=pagerPagecou
2e950 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 29 20 29  nt(pPage->pBt) )
2e960 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e970 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2e980 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43  Page->pBt, pgnoC
2e990 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30  hild, &pChild, 0
2e9a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2e9b0 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
2e9c0 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66  _balance;.    if
2e9d0 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  ( pPage->pgno==1
2e9e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2e9f0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2ea00 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
2ea10 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2ea20 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
2ea30 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65  ance;.      asse
2ea40 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  rt( pChild->nOve
2ea50 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20  rflow==0 );.    
2ea60 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46    if( pChild->nF
2ea70 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20  ree>=100 ){.    
2ea80 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
2ea90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c   information wil
2eaa0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
2eab0 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68  t page, so do th
2eac0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  e.        ** cop
2ead0 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
2eae0 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f   i;.        zero
2eaf0 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2eb00 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  ld->aData[0]);. 
2eb10 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2eb20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
2eb30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2eb40 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e   apCell[i] = fin
2eb50 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b  dCell(pChild,i);
2eb60 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c  .          szCel
2eb70 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  l[i] = cellSizeP
2eb80 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c  tr(pChild, apCel
2eb90 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
2eba0 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c  .        assembl
2ebb0 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  ePage(pPage, pCh
2ebc0 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65  ild->nCell, apCe
2ebd0 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  ll, szCell);.   
2ebe0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65       /* Copy the
2ebf0 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f   right-pointer o
2ec00 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74  f the child to t
2ec10 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  he parent. */.  
2ec20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2ec30 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2ec40 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2ec50 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
2ec60 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2ec70 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2ec80 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
2ec90 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
2eca0 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
2ecb0 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
2ecc0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2ecd0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2ece0 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  pChild);.       
2ecf0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2ed00 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73  : child %d trans
2ed10 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22  fer to page 1\n"
2ed20 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
2ed30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2ed40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
2ed50 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66  ild has more inf
2ed60 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
2ed70 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
2ed80 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ot..        ** T
2ed90 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61  he tree is alrea
2eda0 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f  dy balanced.  Do
2edb0 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20   nothing. */.   
2edc0 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2edd0 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77  ANCE: child %d w
2ede0 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70  ill not fit on p
2edf0 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64  age 1\n", pChild
2ee00 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2ee10 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2ee20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d     memcpy(pPage-
2ee30 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e  >aData, pChild->
2ee40 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42  aData, pPage->pB
2ee50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
2ee60 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49        pPage->isI
2ee70 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  nit = 0;.      r
2ee80 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2ee90 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
2eea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2eeb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2eec0 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
2eed0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52  Child);.      TR
2eee0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74  ACE(("BALANCE: t
2eef0 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64  ransfer child %d
2ef00 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22   into root %d\n"
2ef10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ef20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50  pChild->pgno, pP
2ef30 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
2ef40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2ef50 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2ef60 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
2ef70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2ef80 43 55 55 4d 0a 20 20 20 20 69 66 28 20 49 53 41  CUUM.    if( ISA
2ef90 55 54 4f 56 41 43 55 55 4d 20 26 26 20 72 63 3d  UTOVACUUM && rc=
2efa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2efb0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
2efc0 64 50 74 72 6d 61 70 73 28 70 50 61 67 65 29 3b  dPtrmaps(pPage);
2efd0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2efe0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
2eff0 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73  hild);.  }.end_s
2f000 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a  hallow_balance:.
2f010 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
2f020 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pCell);.  return
2f030 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2f040 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2f050 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57  overfull.**.** W
2f060 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73  hen this happens
2f070 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  , Create a new c
2f080 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f  hild page and co
2f090 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  py the.** conten
2f0a0 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69  ts of the root i
2f0b0 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20  nto the child.  
2f0c0 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f  Then make the ro
2f0d0 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d  ot.** page an em
2f0e0 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69  pty page with ri
2f0f0 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e  ghtChild pointin
2f100 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  g to the new.** 
2f110 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79  child.   Finally
2f120 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69  , call balance_i
2f130 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65  nternal() on the
2f140 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f   new child.** to
2f150 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c   cause it to spl
2f160 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
2f170 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
2f180 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2f190 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2f1a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2f1b0 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
2f1c0 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
2f1d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2f1e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2f1f0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2f200 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
2f210 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  hild;    /* Poin
2f220 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69  ter to a new chi
2f230 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ld page */.  Pgn
2f240 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
2f250 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2f260 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
2f270 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
2f280 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2f290 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a    /* The BTree *
2f2a0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
2f2b0 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ze;     /* Total
2f2c0 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   usable size of 
2f2d0 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  a page */.  u8 *
2f2e0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
2f2f0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2f300 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f  e parent page */
2f310 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20  .  u8 *cdata;   
2f320 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2f330 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  t of the child p
2f340 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  age */.  int hdr
2f350 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2f360 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68  Offset to page h
2f370 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20  eader in parent 
2f380 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
2f390 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2f3a0 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66  et to content of
2f3b0 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70   first cell in p
2f3c0 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  arent */..  asse
2f3d0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
2f3e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2f3f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
2f400 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
2f410 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75  .  VVA_ONLY( pCu
2f420 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
2f430 20 3d 20 31 20 29 3b 0a 20 20 70 50 61 67 65 20   = 1 );.  pPage 
2f440 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
2f450 5d 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  ];.  pBt = pPage
2f460 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
2f470 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2f480 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2f490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2f4a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2f4b0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2f4c0 61 67 65 29 20 29 3b 0a 20 20 72 63 20 3d 20 61  age) );.  rc = a
2f4d0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2f4e0 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26  (pBt, &pChild, &
2f4f0 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65  pgnoChild, pPage
2f500 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66  ->pgno, 0);.  if
2f510 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f520 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2f530 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2f540 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
2f550 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  age) );.  usable
2f560 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
2f570 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d  leSize;.  data =
2f580 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2f590 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2f5a0 72 4f 66 66 73 65 74 3b 0a 20 20 63 62 72 6b 20  rOffset;.  cbrk 
2f5b0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2f5c0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74  [hdr+5]);.  cdat
2f5d0 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  a = pChild->aDat
2f5e0 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74  a;.  memcpy(cdat
2f5f0 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70  a, &data[hdr], p
2f600 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2f610 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  +2*pPage->nCell-
2f620 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  hdr);.  memcpy(&
2f630 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61  cdata[cbrk], &da
2f640 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ta[cbrk], usable
2f650 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a 20 20 61  Size-cbrk);..  a
2f660 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69  ssert( pChild->i
2f670 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63  sInit==0 );.  rc
2f680 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2f690 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b  nitPage(pChild);
2f6a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f6b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
2f6c0 6e 43 6f 70 79 20 3d 20 70 50 61 67 65 2d 3e 6e  nCopy = pPage->n
2f6d0 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28  Overflow*sizeof(
2f6e0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
2f6f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 68  ;.    memcpy(pCh
2f700 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67  ild->aOvfl, pPag
2f710 65 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f 70 79 29  e->aOvfl, nCopy)
2f720 3b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ;.    pChild->nO
2f730 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d  verflow = pPage-
2f740 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
2f750 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  if( pChild->nOve
2f760 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  rflow ){.      p
2f770 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30  Child->nFree = 0
2f780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2f790 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
2f7a0 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  l==pPage->nCell 
2f7b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
2f7c0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2f7d0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2f7e0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65  bPage) );.    ze
2f7f0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
2f800 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
2f810 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20   ~PTF_LEAF);.   
2f820 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2f830 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2f840 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2f850 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 54 52 41  oChild);.    TRA
2f860 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f  CE(("BALANCE: co
2f870 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20  py root %d into 
2f880 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
2f890 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  no, pChild->pgno
2f8a0 29 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55  ));.    if( ISAU
2f8b0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2f8c0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2f8d0 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67  (pBt, pChild->pg
2f8e0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
2f8f0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
2f900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f910 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2f920 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2f930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f940 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
2f950 74 72 6d 61 70 73 28 70 43 68 69 6c 64 29 3b 0a  trmaps(pChild);.
2f960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2f970 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2f980 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
2f990 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  w = 0;.      }.#
2f9a0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
2f9b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f9c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
2f9d0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 20 20 70  ->iPage++;.    p
2f9e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 20 3d  Cur->apPage[1] =
2f9f0 20 70 43 68 69 6c 64 3b 0a 20 20 20 20 70 43 75   pChild;.    pCu
2fa00 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
2fa10 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
2fa20 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b  e_nonroot(pCur);
2fa30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2fa40 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
2fa50 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2fa60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2fa70 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72  e page that pCur
2fa80 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2fa90 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65  s to has just be
2faa0 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a  en modified in.*
2fab0 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73  * some way. This
2fac0 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65   function figure
2fad0 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f  s out if this mo
2fae0 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73  dification means
2faf0 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65   the.** tree nee
2fb00 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
2fb10 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c  d, and if so cal
2fb20 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ls the appropria
2fb30 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a  te balancing .**
2fb40 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
2fb50 20 50 61 72 61 6d 65 74 65 72 20 69 73 49 6e 73   Parameter isIns
2fb60 65 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ert is true if a
2fb70 20 6e 65 77 20 63 65 6c 6c 20 77 61 73 20 6a 75   new cell was ju
2fb80 73 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  st inserted into
2fb90 20 74 68 65 0a 2a 2a 20 70 61 67 65 2c 20 6f 72   the.** page, or
2fba0 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
2fbb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fbc0 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72  balance(BtCursor
2fbd0 20 2a 70 43 75 72 2c 20 69 6e 74 20 69 73 49 6e   *pCur, int isIn
2fbe0 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sert){.  int rc 
2fbf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
2fc00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2fc10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2fc20 72 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20 20 61 73  r->iPage];..  as
2fc30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2fc40 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2fc50 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2fc60 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2fc70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2fc80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2fc90 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2fca0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2fcb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
2fcc0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
2fcd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2fce0 61 6e 63 65 5f 64 65 65 70 65 72 28 70 43 75 72  ance_deeper(pCur
2fcf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2fd00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2fd10 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20  ==pPage );.     
2fd20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2fd30 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
2fd40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2fd50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2fd60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fd70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2fd80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2fd90 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
2fda0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73  pCur);.      ass
2fdb0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2fdc0 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20  e[0]==pPage );. 
2fdd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2fde0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
2fdf0 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
2fe00 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  K );.    }.  }el
2fe10 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
2fe20 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
2fe30 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 73 49  | .        (!isI
2fe40 6e 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e  nsert && pPage->
2fe50 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74  nFree>pPage->pBt
2fe60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2fe70 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2fe80 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2fe90 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
2fea0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2feb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2fec0 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63  ine checks all c
2fed0 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e  ursors that poin
2fee0 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52  t to table pgnoR
2fef0 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  oot..** If any o
2ff00 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20  f those cursors 
2ff10 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68  were opened with
2ff20 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20   wrFlag==0 in a 
2ff30 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74  different.** dat
2ff40 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2ff50 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e   (a database con
2ff60 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61  nection that sha
2ff70 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  res the pager.**
2ff80 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20   cache with the 
2ff90 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69  current connecti
2ffa0 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68  on) and that oth
2ffb0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  er connection .*
2ffc0 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  * is not in the 
2ffd0 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64  ReadUncommmitted
2ffe0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69   state, then thi
2fff0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
30000 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  s .** SQLITE_LOC
30010 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65  KED..**.** As we
30020 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69  ll as cursors wi
30030 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75  th wrFlag==0, cu
30040 72 73 6f 72 73 20 77 69 74 68 20 0a 2a 2a 20 69  rsors with .** i
30050 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d  sIncrblobHandle=
30060 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73  =1 are also cons
30070 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63 75  idered 'read' cu
30080 72 73 6f 72 73 20 62 65 63 61 75 73 65 0a 2a 2a  rsors because.**
30090 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
300a0 62 20 63 75 72 73 6f 72 73 20 61 72 65 20 75 73  b cursors are us
300b0 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
300c0 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
300d0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f  .**.** When pgno
300e0 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74  Root is the root
300f0 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b   page of an intk
30100 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66  ey table, this f
30110 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a  unction is also.
30120 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
30130 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  or invalidating 
30140 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
30150 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68   cursors when th
30160 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f  e table row.** o
30170 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 72 65  n which they are
30180 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74   opened is delet
30190 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20  ed or modified. 
301a0 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  Cursors are inva
301b0 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72  lidated.** accor
301c0 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ding to the foll
301d0 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  owing rules:.**.
301e0 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42 74 72  **   1) When Btr
301f0 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69  eeClearTable() i
30200 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
30210 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68  letely delete th
30220 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20  e contents.**   
30230 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74     of a B-Tree t
30240 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69  able, pExclude i
30250 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e  s set to zero an
30260 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77  d parameter iRow
30270 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74   is .**      set
30280 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   to non-zero. In
30290 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69   this case all i
302a0 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
302b0 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20  cursors open.** 
302c0 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c       on the tabl
302d0 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f  e rooted at pgno
302e0 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64  Root are invalid
302f0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  ated..**.**   2)
30300 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72   When BtreeInser
30310 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65  t(), BtreeDelete
30320 28 29 20 6f 72 20 42 74 72 65 65 50 75 74 44 61  () or BtreePutDa
30330 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ta() is called t
30340 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66  o .**      modif
30350 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69  y a table row vi
30360 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  a an SQL stateme
30370 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20  nt, pExclude is 
30380 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20  set to the .**  
30390 20 20 20 20 77 72 69 74 65 20 63 75 72 73 6f 72      write cursor
303a0 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20   used to do the 
303b0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64  modification and
303c0 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20   parameter iRow 
303d0 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74  is set.**      t
303e0 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f  o the integer ro
303f0 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72  w id of the B-Tr
30400 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d  ee entry being m
30410 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a  odified. Unless.
30420 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75 64 65  **      pExclude
30430 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e   is itself an in
30440 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
30450 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20  ursor, then all 
30460 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20  incremental.**  
30470 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73      blob cursors
30480 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f   open on row iRo
30490 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  w of the B-Tree 
304a0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
304b0 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62  .**.**   3) If b
304c0 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64  oth pExclude and
304d0 20 69 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f   iRow are set to
304e0 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d   zero, no increm
304f0 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20  ental blob .**  
30500 20 20 20 20 63 75 72 73 6f 72 73 20 61 72 65 20      cursors are 
30510 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
30520 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
30530 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  ForReadConflicts
30540 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
30550 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
30560 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30570 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50   to check */.  P
30580 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20  gno pgnoRoot,   
30590 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66         /* Look f
305a0 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  or read cursors 
305b0 6f 6e 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  on this btree */
305c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
305d0 63 6c 75 64 65 2c 20 20 20 20 20 2f 2a 20 49 67  clude,     /* Ig
305e0 6e 6f 72 65 20 74 68 69 73 20 63 75 72 73 6f 72  nore this cursor
305f0 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 20 20   */.  i64 iRow  
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30610 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
30620 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
30630 67 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  g */.){.  BtCurs
30640 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65  or *p;.  BtShare
30650 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d  d *pBt = pBtree-
30660 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
30670 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  *db = pBtree->db
30680 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
30690 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
306a0 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
306b0 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
306c0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
306d0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70  t){.    if( p==p
306e0 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e  Exclude ) contin
306f0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ue;.    if( p->p
30700 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f  gnoRoot!=pgnoRoo
30710 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  t ) continue;.#i
30720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30730 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69  T_INCRBLOB.    i
30740 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
30750 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20 20 20  Handle && ( .   
30760 20 20 20 20 20 20 28 21 70 45 78 63 6c 75 64 65        (!pExclude
30770 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20 20 20   && iRow).      
30780 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26 26 20  || (pExclude && 
30790 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63  !pExclude->isInc
307a0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 70  rblobHandle && p
307b0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
307c0 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  w).    )){.     
307d0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
307e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
307f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
30800 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  ( p->eState!=CUR
30810 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74  SOR_VALID ) cont
30820 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
30830 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e  >wrFlag==0 .#ifn
30840 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30850 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c  INCRBLOB.     ||
30860 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61   p->isIncrblobHa
30870 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  ndle.#endif.    
30880 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30890 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70   *dbOther = p->p
308a0 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
308b0 20 61 73 73 65 72 74 28 64 62 4f 74 68 65 72 29   assert(dbOther)
308c0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74  ;.      if( dbOt
308d0 68 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74  her!=db && (dbOt
308e0 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  her->flags & SQL
308f0 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
30900 74 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ted)==0 ){.     
30910 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
30920 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 64 62 2c 20  tionBlocked(db, 
30930 64 62 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20  dbOther);.      
30940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30950 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
30960 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  HE;.      }.    
30970 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
30980 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
30990 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
309a0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
309b0 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20  BTree.  The key 
309c0 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65  is given by (pKe
309d0 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74  y,nKey).** and t
309e0 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e  he data is given
309f0 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61   by (pData,nData
30a00 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69  ).  The cursor i
30a10 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a  s used only to.*
30a20 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61  * define what ta
30a30 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73  ble the record s
30a40 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
30a50 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72  d into.  The cur
30a60 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
30a70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
30a80 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  dom location..**
30a90 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45  .** For an INTKE
30aa0 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68  Y table, only th
30ab0 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20  e nKey value of 
30ac0 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e  the key is used.
30ad0 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
30ae0 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52  ored.  For a ZER
30af0 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65  ODATA table, the
30b00 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61   pData and nData
30b10 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65   are both ignore
30b20 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
30b30 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
30b40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b60 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
30b70 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
30b80 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
30b90 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
30ba0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
30bb0 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
30bc0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
30bd0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
30be0 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
30bf0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
30c00 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
30c10 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
30c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30c40 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f  extra 0 bytes to
30c50 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
30c60 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42  */.  int appendB
30c70 69 61 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ias             
30c80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
30c90 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e  his is likely an
30ca0 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20   append */.){.  
30cb0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f  int rc;.  int lo
30cc0 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a  c;.  int szNew;.
30cd0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
30ce0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42  Page *pPage;.  B
30cf0 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
30d00 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
30d10 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
30d20 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
30d30 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e  r *oldCell;.  un
30d40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77  signed char *new
30d50 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Cell = 0;..  ass
30d60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
30d70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
30d80 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
30d90 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
30da0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
30db0 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
30dc0 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74  Only );.  assert
30dd0 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
30de0 3b 0a 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f  ;.  rc = checkFo
30df0 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  rReadConflicts(p
30e00 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
30e10 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
30e20 72 2c 20 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20  r, nKey);.  if( 
30e30 72 63 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  rc ){           
30e40 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61    .    /* The ta
30e50 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
30e60 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
30e70 63 6b 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ck */.    assert
30e80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43  ( rc==SQLITE_LOC
30e90 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 20  KED_SHAREDCACHE 
30ea0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
30eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
30ec0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
30ed0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
30ee0 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
30ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
30f00 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
30f10 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
30f20 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
30f30 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
30f40 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
30f50 6f 72 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  or(pCur);.  if( 
30f60 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
30f70 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
30f80 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
30f90 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
30fa0 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f   ||.    SQLITE_O
30fb0 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
30fc0 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
30fd0 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70  , pKey, nKey, ap
30fe0 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29  pendBias, &loc))
30ff0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
31000 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67   rc;.  }..  pPag
31010 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
31020 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
31030 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
31040 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d  intKey || nKey>=
31050 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
31060 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70  Page->leaf || !p
31070 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
31080 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54    TRACE(("INSERT
31090 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d  : table=%d nkey=
310a0 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61  %lld ndata=%d pa
310b0 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  ge=%d %s\n",.   
310c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
310d0 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61  oRoot, nKey, nDa
310e0 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ta, pPage->pgno,
310f0 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d  .          loc==
31100 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20  0 ? "overwrite" 
31110 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b  : "new entry"));
31120 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31130 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c  ->isInit );.  al
31140 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
31150 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20  pBt);.  newCell 
31160 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
31170 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d  ;.  if( newCell=
31180 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
31190 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d  TE_NOMEM;.  rc =
311a0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67   fillInCell(pPag
311b0 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79  e, newCell, pKey
311c0 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e  , nKey, pData, n
311d0 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a  Data, nZero, &sz
311e0 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29  New);.  if( rc )
311f0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
31200 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
31210 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  w==cellSizePtr(p
31220 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29  Page, newCell) )
31230 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
31240 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w<=MX_CELL_SIZE(
31250 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  pBt) );.  idx = 
31260 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
31270 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
31280 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52  loc==0 && CURSOR
31290 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
312a0 74 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20  tate ){.    u16 
312b0 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72  szOld;.    asser
312c0 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  t( idx<pPage->nC
312d0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
312e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
312f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
31300 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
31310 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
31320 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
31330 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64    oldCell = find
31340 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
31350 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
31360 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
31370 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20  memcpy(newCell, 
31380 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  oldCell, 4);.   
31390 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63   }.    szOld = c
313a0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
313b0 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
313c0 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
313d0 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
313e0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
313f0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
31400 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28    rc = dropCell(
31410 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c  pPage, idx, szOl
31420 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
31430 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
31440 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73      goto end_ins
31450 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ert;.    }.  }el
31460 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20  se if( loc<0 && 
31470 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
31480 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
31490 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  age->leaf );.   
314a0 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
314b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
314c0 5d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  ];.    pCur->inf
314d0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
314e0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
314f0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
31500 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
31510 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
31520 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
31530 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43  pPage, idx, newC
31540 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30  ell, szNew, 0, 0
31550 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
31560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
31570 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
31580 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   1);.  }..  /* M
31590 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f  ust make sure nO
315a0 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74  verflow is reset
315b0 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66   to zero even if
315c0 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20   the balance(). 
315d0 20 2a 2a 20 66 61 69 6c 73 2e 20 20 49 6e 74 65   ** fails.  Inte
315e0 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
315f0 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ure corruption w
31600 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72  ill result other
31610 77 69 73 65 2e 20 2a 2f 0a 20 20 70 43 75 72 2d  wise. */.  pCur-
31620 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
31630 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  age]->nOverflow 
31640 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  = 0;..  if( rc==
31650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31660 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
31670 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
31680 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
31690 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
316a0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
316b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
316c0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
316d0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
316e0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61   pointing at a a
316f0 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f  rbitrary locatio
31700 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
31710 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43  3BtreeDelete(BtC
31720 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
31730 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
31740 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
31750 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e  ur->iPage];.  in
31760 74 20 69 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65  t idx;.  unsigne
31770 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
31780 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
31790 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20  pgnoChild = 0;. 
317a0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
317b0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
317c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
317d0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
317e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
317f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
31800 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
31810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
31820 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
31830 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
31840 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
31850 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69  >readOnly );.  i
31860 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
31870 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
31880 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
31890 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66  ->skip;.  }.  if
318a0 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 69  ( NEVER(pCur->ai
318b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
318c0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 20  >=pPage->nCell) 
318d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
318e0 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20  LITE_ERROR;  /* 
318f0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  The cursor is no
31900 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  t pointing to an
31910 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
31920 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
31930 46 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63  Flag );.  rc = c
31940 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c  heckForReadConfl
31950 69 63 74 73 28 70 2c 20 70 43 75 72 2d 3e 70 67  icts(p, pCur->pg
31960 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43  noRoot, pCur, pC
31970 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
31980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31990 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
319a0 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
319b0 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
319c0 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61 73  d lock */.    as
319d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
319e0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
319f0 43 48 45 20 29 3b 0a 20 20 20 20 72 65 74 75 72  CHE );.    retur
31a00 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
31a10 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  Restore the curr
31a20 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
31a30 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20  ion (a no-op if 
31a40 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
31a50 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f  t in .  ** CURSO
31a60 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
31a70 61 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68  ate) and save th
31a80 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
31a90 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
31aa0 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74   .  ** open on t
31ab0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54  he same table. T
31ac0 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
31ad0 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
31ae0 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68  the page.  ** th
31af0 61 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c  at the entry wil
31b00 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f  l be deleted fro
31b10 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  m..  */.  if( . 
31b20 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65     (rc = restore
31b30 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
31b40 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
31b50 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
31b60 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
31b70 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
31b80 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
31b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31ba0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
31bb0 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  e))!=0.  ){.    
31bc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
31bd0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
31be0 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20  cell within its 
31bf0 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70  page and leave p
31c00 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f  Cell pointing to
31c10 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20   the.  ** data. 
31c20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20  The clearCell() 
31c30 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f  call frees any o
31c40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
31c50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
31c60 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  e.  ** cell. The
31c70 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20   cell itself is 
31c80 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20  still intact..  
31c90 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d  */.  idx = pCur-
31ca0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
31cb0 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  ge];.  pCell = f
31cc0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
31cd0 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  dx);.  if( !pPag
31ce0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
31cf0 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
31d00 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  yte(pCell);.  }.
31d10 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
31d20 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
31d30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
31d50 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
31d60 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
31d70 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
31d80 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
31d90 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
31da0 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
31db0 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
31dc0 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
31dd0 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
31de0 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
31df0 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
31e00 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
31e10 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
31e20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
31e30 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
31e40 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
31e50 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
31e60 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
31e70 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
31e80 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
31e90 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
31ea0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
31eb0 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
31ec0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
31ed0 4c 65 61 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20  LeafPage = 0;.. 
31ee0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
31ef0 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
31f00 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e   notUsed;.    un
31f10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
31f20 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61  pCell = 0;.    a
31f30 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69  ssert( !pPage->i
31f40 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  ntKey );.    sql
31f50 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70  ite3BtreeGetTemp
31f60 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65  Cursor(pCur, &le
31f70 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d  afCur);.    rc =
31f80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
31f90 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74  t(&leafCur, &not
31fa0 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
31fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
31fd0 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66  afCur.aiIdx[leaf
31fe0 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b  Cur.iPage]==0 );
31ff0 0a 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65  .      pLeafPage
32000 20 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67   = leafCur.apPag
32010 65 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d  e[leafCur.iPage]
32020 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
32030 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32040 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67  LeafPage->pDbPag
32050 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
32060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32070 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61  ){.      int lea
32080 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d  fCursorInvalid =
32090 20 30 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   0;.      u16 sz
320a0 4e 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43  Next;.      TRAC
320b0 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
320c0 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65  e=%d delete inte
320d0 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70  rnal from %d rep
320e0 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lace from leaf %
320f0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
32100 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
32110 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61  Page->pgno, pLea
32120 66 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  fPage->pgno));. 
32130 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
32140 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69  age, idx, cellSi
32150 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
32160 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
32170 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65  t = findCell(pLe
32180 61 66 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  afPage, 0);.    
32190 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53    szNext = cellS
321a0 69 7a 65 50 74 72 28 70 4c 65 61 66 50 61 67 65  izePtr(pLeafPage
321b0 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  , pNext);.      
321c0 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f  assert( MX_CELL_
321d0 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78  SIZE(pBt)>=szNex
321e0 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  t+4 );.      all
321f0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
32200 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43  Bt);.      tempC
32210 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
32220 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20  pace;.      if( 
32230 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  tempCell==0 ){. 
32240 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32250 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
32260 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
32270 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32280 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
32290 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
322a0 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74   pNext-4, szNext
322b0 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29  +4, tempCell, 0)
322c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ;.      }...    
322d0 20 20 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74    /* The "if" st
322e0 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e  atement in the n
322f0 65 78 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69  ext code block i
32300 73 20 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65  s critical.  The
32310 0a 20 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74  .      ** slight
32320 65 73 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61  est error in tha
32330 74 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c  t statement woul
32340 64 20 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74  d allow SQLite t
32350 6f 20 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20  o operate.      
32360 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73  ** correctly mos
32370 74 20 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75  t of the time bu
32380 74 20 70 72 6f 64 75 63 65 20 76 65 72 79 20 72  t produce very r
32390 61 72 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54  are failures.  T
323a0 6f 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64  o.      ** guard
323b0 20 61 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74   against this, t
323c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
323d0 72 6f 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69  ros help to veri
323e0 66 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  fy that.      **
323f0 20 74 68 65 20 22 69 66 22 20 73 74 61 74 65 6d   the "if" statem
32400 65 6e 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74  ent is well test
32410 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
32420 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
32430 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
32440 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
32450 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  <pBt->usableSize
32460 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20  *2/3 .          
32470 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
32480 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
32490 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
324a0 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
324b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
324c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
324d0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
324e0 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ==pBt->usableSiz
324f0 65 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20  e*2/3 .         
32500 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66          && pLeaf
32510 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
32520 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
32530 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20  leSize*2/3 );.  
32540 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
32550 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
32560 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  0 && pPage->nFre
32570 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e==pBt->usableSi
32580 7a 65 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20  ze*2/3+1 .      
32590 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c             && pL
325a0 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
325b0 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75  +szNext > pBt->u
325c0 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
325d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
325e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
325f0 77 3e 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  w>0 && pPage->nF
32600 72 65 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ree<=pBt->usable
32610 53 69 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20  Size*2/3.       
32620 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
32630 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
32640 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
32650 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
32660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
32670 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  (pPage->nOverflo
32680 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e  w>0 || (pPage->n
32690 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62  Free > pBt->usab
326a0 6c 65 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20  leSize*2/3)).   
326b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
326c0 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
326d0 65 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42  e+2+szNext == pB
326e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
326f0 33 20 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28  3 );...      if(
32700 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c   (pPage->nOverfl
32710 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e  ow>0 || (pPage->
32720 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61  nFree > pBt->usa
32730 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26  bleSize*2/3)) &&
32740 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 65 61  .          (pLea
32750 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
32760 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
32770 62 6c 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20  bleSize*2/3).   
32780 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
32790 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
327a0 74 61 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74  taken if the int
327b0 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f  ernal node is no
327c0 77 20 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f  w either overflo
327d0 77 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  wing.        ** 
327e0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64  or underfull and
327f0 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77   the leaf node w
32800 69 6c 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c  ill be underfull
32810 20 61 66 74 65 72 20 74 68 65 20 6a 75 73 74 20   after the just 
32820 63 65 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  cell .        **
32830 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69   copied to the i
32840 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20  nternal node is 
32850 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e  deleted from it.
32860 20 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69   This is a speci
32870 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  al.        ** ca
32880 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  se because the c
32890 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29  all to balance()
328a0 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20   to correct the 
328b0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20  internal node.  
328c0 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61        ** may cha
328d0 6e 67 65 20 74 68 65 20 74 72 65 65 20 73 74 72  nge the tree str
328e0 75 63 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c  ucture and inval
328f0 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
32900 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ts of.        **
32910 20 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50   the leafCur.apP
32920 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75  age[] and leafCu
32930 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  r.aiIdx[] arrays
32940 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a  , which will be.
32950 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20          ** used 
32960 62 79 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  by the balance()
32970 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72   required to cor
32980 72 65 63 74 20 74 68 65 20 75 6e 64 65 72 66 75  rect the underfu
32990 6c 6c 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20  ll leaf.        
329a0 2a 2a 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20  ** node..       
329b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
329c0 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
329d0 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
329e0 6e 20 61 62 6f 76 65 20 61 72 65 20 62 61 73 65  n above are base
329f0 64 20 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20  d on facets of. 
32a00 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
32a10 4c 69 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74  Lite file-format
32a20 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61   that do not cha
32a30 6e 67 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20  nge over time.. 
32a40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32a50 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
32a60 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75  e->nFree==pBt->u
32a70 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20  sableSize*2/3+1 
32a80 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
32a90 61 73 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e  ase( pLeafPage->
32aa0 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d  nFree+2+szNext==
32ab0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
32ac0 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  2/3+1 );.       
32ad0 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c   leafCursorInval
32ae0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20  id = 1;.      } 
32af0 20 20 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69         ..      i
32b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32b10 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
32b20 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
32b30 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
32b40 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
32b50 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32b60 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
32b70 28 70 50 61 67 65 2c 20 69 64 78 29 2c 20 70 67  (pPage, idx), pg
32b80 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  noChild);.      
32b90 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
32ba0 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
32bb0 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  = 0 );.        r
32bc0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
32bd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
32be0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32bf0 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75  ITE_OK && leafCu
32c00 72 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20  rsorInvalid ){. 
32c10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
32c20 61 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75  af-node is now u
32c30 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20  nderfull and so 
32c40 74 68 65 20 74 72 65 65 20 6e 65 65 64 73 20 74  the tree needs t
32c50 6f 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  o be .        **
32c60 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77   rebalanced. How
32c70 65 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63  ever, the balanc
32c80 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  e() operation on
32c90 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20   the internal.  
32ca0 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62        ** node ab
32cb0 6f 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64  ove may have mod
32cc0 69 66 69 65 64 20 74 68 65 20 73 74 72 75 63 74  ified the struct
32cd0 75 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65  ure of the B-Tre
32ce0 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  e and.        **
32cf0 20 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   so the current 
32d00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66  contents of leaf
32d10 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
32d20 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d   leafCur.aiIdx[]
32d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
32d40 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
32d50 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
32d60 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20     ** It is not 
32d70 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79  possible to copy
32d80 20 74 68 65 20 61 6e 63 65 73 74 72 79 20 66 72   the ancestry fr
32d90 6f 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65 20  om pCur, as the 
32da0 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  same.        ** 
32db0 62 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68  balance() call h
32dc0 61 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74  as invalidated t
32dd0 68 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  he pCur->apPage[
32de0 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20  ] and aiIdx[].  
32df0 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e        ** arrays.
32e00 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
32e10 20 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c       ** The call
32e20 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f   to saveCursorPo
32e30 73 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69  sition() below i
32e40 6e 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20  nternally saves 
32e50 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
32e60 6b 65 79 20 74 68 61 74 20 6c 65 61 66 43 75 72  key that leafCur
32e70 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
32e80 69 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65  inting to. Curre
32e90 6e 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20  ntly, there.    
32ea0 20 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63      ** are two c
32eb0 6f 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65  opies of that ke
32ec0 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20  y in the tree - 
32ed0 6f 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20  one here on the 
32ee0 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  leaf.        ** 
32ef0 70 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20  page and one on 
32f00 73 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  some internal no
32f10 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20  de in the tree. 
32f20 54 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20  The copy on.    
32f30 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20      ** the leaf 
32f40 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 74  node is always t
32f50 68 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74  he next key in t
32f60 72 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20  ree-order after 
32f70 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
32f80 63 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65  copy on the inte
32f90 72 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74  rnal node. So, t
32fa0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
32fb0 65 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20  e3BtreeNext().  
32fc0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72        ** calls r
32fd0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
32fe0 74 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20  tion() to point 
32ff0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
33000 65 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a  e copy.        *
33010 2a 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  * stored on the 
33020 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74  internal node, t
33030 68 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20  hen advances to 
33040 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a  the next entry,.
33050 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68          ** which
33060 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
33070 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b  he copy of the k
33080 65 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e  ey on the intern
33090 61 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20  al node..       
330a0 20 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20   ** Net effect: 
330b0 6c 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74  leafCur is point
330c0 69 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ing back to the 
330d0 64 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20  duplicate cell. 
330e0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e         ** that n
330f0 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76  eeds to be remov
33100 65 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ed, and the leaf
33110 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
33120 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66  .        ** leaf
33130 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61  Cur.aiIdx[] arra
33140 79 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a  ys are correct..
33150 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33160 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e     VVA_ONLY( Pgn
33170 6f 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65  o leafPgno = pLe
33180 61 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  afPage->pgno );.
33190 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
331a0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
331b0 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20  &leafCur);.     
331c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
331d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
331e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
331f0 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
33200 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
33210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
33220 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43  LeafPage = leafC
33230 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75  ur.apPage[leafCu
33240 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20  r.iPage];.      
33250 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
33260 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 4c 65 61 66  LITE_OK || pLeaf
33270 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66  Page->pgno==leaf
33280 50 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20  Pgno );.        
33290 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
332a0 54 45 5f 4f 4b 20 7c 7c 20 6c 65 61 66 43 75 72  TE_OK || leafCur
332b0 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69  .aiIdx[leafCur.i
332c0 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  Page]==0 );.    
332d0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 53    }..      if( S
332e0 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20  QLITE_OK==rc.   
332f0 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
33300 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ==(rc = sqlite3P
33310 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50  agerWrite(pLeafP
33320 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 0a  age->pDbPage)) .
33330 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
33340 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50   dropCell(pLeafP
33350 61 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b  age, 0, szNext);
33360 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  .        VVA_ONL
33370 59 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73  Y( leafCur.pages
33380 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a  Shuffled = 0 );.
33390 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
333a0 61 6e 63 65 28 26 6c 65 61 66 43 75 72 2c 20 30  ance(&leafCur, 0
333b0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
333c0 74 28 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76  t( leafCursorInv
333d0 61 6c 69 64 20 7c 7c 20 21 6c 65 61 66 43 75 72  alid || !leafCur
333e0 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64 0a 20  .pagesShuffled. 
333f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33410 20 20 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67 65    || !pCur->page
33420 73 53 68 75 66 66 6c 65 64 20 29 3b 0a 20 20 20  sShuffled );.   
33430 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
33440 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
33450 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65  seTempCursor(&le
33460 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  afCur);.  }else{
33470 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c  .    TRACE(("DEL
33480 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65  ETE: table=%d de
33490 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lete from leaf %
334a0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75  d\n",.       pCu
334b0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
334c0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
334d0 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
334e0 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69  age, idx, cellSi
334f0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
33500 6c 6c 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ll));.    if( rc
33510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33520 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
33530 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  e(pCur, 0);.    
33540 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
33550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33560 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
33570 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33580 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
33590 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
335a0 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
335b0 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
335c0 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
335d0 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
335e0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
335f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
33600 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
33610 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
33620 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
33630 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
33640 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
33650 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
33660 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
33670 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
33680 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
33690 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
336a0 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
336b0 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
336c0 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
336d0 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
336e0 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
336f0 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
33700 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
33710 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
33720 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
33730 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
33740 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
33750 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
33760 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
33770 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
33780 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
33790 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
337a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
337b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
337c0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
337d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
337e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
337f0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
33800 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
33810 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69  >readOnly );..#i
33820 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
33830 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63  _AUTOVACUUM.  rc
33840 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
33850 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
33860 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
33870 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
33880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
33890 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70   }.#else.  if( p
338a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
338b0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d  {.    Pgno pgnoM
338c0 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76  ove;      /* Mov
338d0 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f  e a page here to
338e0 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
338f0 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a  he root-page */.
33900 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
33910 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70  geMove; /* The p
33920 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20  age to move to. 
33930 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  */..    /* Creat
33940 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
33950 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71  may probably req
33960 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65  uire moving an e
33970 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
33980 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20  .    ** to make 
33990 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77  room for the new
339a0 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67   tables root pag
339b0 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20  e. In case this 
339c0 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a  page turns.    *
339d0 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f  * out to be an o
339e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65  verflow page, de
339f0 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f  lete all overflo
33a00 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65  w page-map cache
33a10 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79  s.    ** held by
33a20 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20   open cursors.. 
33a30 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69     */.    invali
33a40 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
33a50 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20  ache(pBt);..    
33a60 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75  /* Read the valu
33a70 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f  e of meta[3] fro
33a80 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  m the database t
33a90 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72  o determine wher
33aa0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  e the.    ** roo
33ab0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
33ac0 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67  w table should g
33ad0 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68  o. meta[3] is th
33ae0 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
33af0 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  age.    ** creat
33b00 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68  ed so far, so th
33b10 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
33b20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a  is (meta[3]+1)..
33b30 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
33b40 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
33b50 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52  eta(p, 4, &pgnoR
33b60 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  oot);.    if( rc
33b70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33b80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33b90 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f      }.    pgnoRo
33ba0 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ot++;..    /* Th
33bb0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
33bc0 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63  may not be alloc
33bd0 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65  ated on a pointe
33be0 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74  r-map page, or t
33bf0 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  he.    ** PENDIN
33c00 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20  G_BYTE page..   
33c10 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
33c20 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f  gnoRoot==PTRMAP_
33c30 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f  PAGENO(pBt, pgno
33c40 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  Root) ||.       
33c50 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49   pgnoRoot==PENDI
33c60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33c70 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52  ) ){.      pgnoR
33c80 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  oot++;.    }.   
33c90 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f   assert( pgnoRoo
33ca0 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  t>=3 );..    /* 
33cb0 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e  Allocate a page.
33cc0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
33cd0 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73  urrently resides
33ce0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c   at pgnoRoot wil
33cf0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65  l.    ** be move
33d00 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  d to the allocat
33d10 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20  ed page (unless 
33d20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
33d30 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a  ge happens.    *
33d40 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70  * to reside at p
33d50 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f  gnoRoot)..    */
33d60 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
33d70 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
33d80 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67   &pPageMove, &pg
33d90 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74  noMove, pgnoRoot
33da0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
33db0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33dc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33dd0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
33de0 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f  gnoMove!=pgnoRoo
33df0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67  t ){.      /* pg
33e00 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61  noRoot is the pa
33e10 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ge that will be 
33e20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  used for the roo
33e30 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20  t-page of.      
33e40 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
33e50 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72   (assuming an er
33e60 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75  ror did not occu
33e70 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a  r). But we were.
33e80 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
33e90 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20  ed pgnoMove. If 
33ea0 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69  required (i.e. i
33eb0 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c  f it was not all
33ec0 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ocated.      ** 
33ed0 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65  by extending the
33ee0 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72   file), the curr
33ef0 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73 69  ent page at posi
33f00 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20  tion pgnoMove.  
33f10 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
33f20 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20  y journaled..   
33f30 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65     */.      u8 e
33f40 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Type;.      Pgno
33f50 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
33f60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
33f70 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20  ageMove);..     
33f80 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67   /* Move the pag
33f90 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70  e currently at p
33fa0 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d  gnoRoot to pgnoM
33fb0 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ove. */.      rc
33fc0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
33fd0 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
33fe0 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
33ff0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
34000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34010 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
34020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
34030 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
34040 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79  , pgnoRoot, &eTy
34050 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
34060 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34070 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65  LITE_OK || eType
34080 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
34090 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
340a0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
340b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
340c0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
340d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
340e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
340f0 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
34100 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
34110 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
34120 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e!=PTRMAP_FREEPA
34130 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  GE );.      rc =
34140 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
34150 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c  t, pRoot, eType,
34160 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d   iPtrPage, pgnoM
34170 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ove, 0);.      r
34180 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
34190 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  );..      /* Obt
341a0 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20  ain the page at 
341b0 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20  pgnoRoot */.    
341c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
341d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
341e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
341f0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
34200 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
34210 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
34220 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
34230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
34250 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34260 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
34270 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34280 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
34290 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
342a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
342b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
342c0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
342d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
342e0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
342f0 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65     pRoot = pPage
34300 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20  Move;.    } ..  
34310 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
34320 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20  pointer-map and 
34330 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74  meta-data with t
34340 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
34350 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   number. */.    
34360 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
34370 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54  Bt, pgnoRoot, PT
34380 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
34390 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
343a0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
343b0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
343c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
343d0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
343e0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
343f0 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74  a(p, 4, pgnoRoot
34400 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
34410 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
34420 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
34430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34440 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
34450 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
34460 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
34470 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
34480 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
34490 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
344a0 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
344b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
344c0 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
344d0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
344e0 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
344f0 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46  flags | PTF_LEAF
34500 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
34510 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44  rUnref(pRoot->pD
34520 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62  bPage);.  *piTab
34530 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
34540 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
34550 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
34560 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
34570 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
34580 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
34590 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
345a0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
345b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
345c0 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
345d0 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
345e0 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
345f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
34600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34610 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
34620 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
34630 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
34640 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
34650 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
34660 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
34670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
34680 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
34690 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
346a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
346b0 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
346c0 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
346d0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
346e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
346f0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
34700 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65  ar */.  int free
34710 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a  PageFlag,     /*
34720 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65   Deallocate page
34730 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
34740 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20  t *pnChange.){. 
34750 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
34760 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
34770 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
34780 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pCell;.  int i;.
34790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
347a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
347b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
347c0 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67  f( pgno>pagerPag
347d0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
347e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
347f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
34800 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   }..  rc = getAn
34810 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
34820 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
34830 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
34840 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
34850 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
34860 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
34870 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
34880 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
34890 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
348a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
348b0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
348c0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
348d0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
348e0 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
348f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
34900 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
34910 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
34920 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
34930 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
34940 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
34950 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
34960 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
34970 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
34980 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  f ){.    rc = cl
34990 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
349a0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
349b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c  Page->aData[8]),
349c0 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
349d0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
349e0 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
349f0 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  ge_out;.  }else 
34a00 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a  if( pnChange ){.
34a10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34a20 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  e->intKey );.   
34a30 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50   *pnChange += pP
34a40 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  age->nCell;.  }.
34a50 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c    if( freePageFl
34a60 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ag ){.    rc = f
34a70 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
34a80 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
34a90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34aa0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
34ab0 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ge))==0 ){.    z
34ac0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
34ad0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c  Page->aData[0] |
34ae0 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a   PTF_LEAF);.  }.
34af0 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61  .cleardatabasepa
34b00 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  ge_out:.  releas
34b10 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
34b20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34b30 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  .** Delete all i
34b40 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
34b50 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
34b60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
34b70 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68   iTable is.** th
34b80 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
34b90 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
34ba0 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74   table.  After t
34bb0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
34bc0 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74  rns,.** the root
34bd0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20   page is empty, 
34be0 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73  but still exists
34bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
34c00 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
34c10 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
34c20 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
34c30 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20  ny open.** read 
34c40 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
34c50 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74  able.  Open writ
34c60 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f  e cursors are mo
34c70 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f  ved to the.** ro
34c80 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
34c90 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e  .**.** If pnChan
34ca0 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
34cb0 74 68 65 6e 20 74 61 62 6c 65 20 69 54 61 62 6c  then table iTabl
34cc0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74  e must be an int
34cd0 6b 65 79 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a  key table. The.*
34ce0 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * integer value 
34cf0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 6e  pointed to by pn
34d00 43 68 61 6e 67 65 20 69 73 20 69 6e 63 72 65 6d  Change is increm
34d10 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
34d20 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65  ber of.** entrie
34d30 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
34d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
34d50 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
34d60 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
34d70 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67  le, int *pnChang
34d80 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
34d90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
34da0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
34db0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
34dc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
34dd0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
34de0 45 20 29 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  E );.  if( (rc =
34df0 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e   checkForReadCon
34e00 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
34e10 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  , 0, 1))!=SQLITE
34e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  _OK ){.    /* no
34e30 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
34e40 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
34e50 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
34e60 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
34e70 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20  iTable, 0)) ){. 
34e80 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
34e90 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a   do */.  }else{.
34ea0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
34eb0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
34ec0 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c  (Pgno)iTable, 0,
34ed0 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a   pnChange);.  }.
34ee0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
34ef0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
34f00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
34f10 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ase all informat
34f20 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61  ion in a table a
34f30 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20  nd add the root 
34f40 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a  of the table to.
34f50 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
34f60 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f    Except, the ro
34f70 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69  ot of the princi
34f80 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f  ple table (the o
34f90 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29  ne on.** page 1)
34fa0 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
34fb0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
34fc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
34fd0 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
34fe0 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
34ff0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
35000 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  y open.** cursor
35010 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
35020 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
35030 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61  UUM is enabled a
35040 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69  nd the page at i
35050 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65  Table is not the
35060 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61   last.** root pa
35070 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
35080 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
35090 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
350a0 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61   .** in the data
350b0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76  base file is mov
350c0 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74  ed into the slot
350d0 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
350e0 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20  ed by.** iTable 
350f0 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c  and that last sl
35100 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
35110 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74  pied by the last
35120 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
35130 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
35140 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f  eelist instead o
35150 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68  f iTable.  In th
35160 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72  is say, all.** r
35170 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65  oot pages are ke
35180 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  pt at the beginn
35190 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
351a0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a  ase file, which.
351b0 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ** is necessary 
351c0 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74  for AUTOVACUUM t
351d0 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a  o work right.  *
351e0 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
351f0 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e  o the .** page n
35200 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20  umber that used 
35210 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72  to be the last r
35220 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
35230 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  file before.** t
35240 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20  he move.  If no 
35250 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c  page gets moved,
35260 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
35270 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61   to 0..** The la
35280 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  st root page is 
35290 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61  recorded in meta
352a0 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75  [3] and the valu
352b0 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20  e of.** meta[3] 
352c0 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
352d0 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f  is procedure..*/
352e0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
352f0 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
35300 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
35310 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
35320 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
35330 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
35340 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
35350 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
35360 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
35370 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
35380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
35390 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
353a0 52 49 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 74  RITE );..  /* It
353b0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64   is illegal to d
353c0 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61  rop a table if a
353d0 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f  ny cursors are o
353e0 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  pen on the.  ** 
353f0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
35400 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74  s because in aut
35410 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68  o-vacuum mode th
35420 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20  e backend may.  
35430 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  ** need to move 
35440 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67  another root-pag
35450 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20  e to fill a gap 
35460 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
35470 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61  ted.  ** root pa
35480 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63  ge. If an open c
35490 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
354a0 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62  this page a prob
354b0 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20  lem would .  ** 
354c0 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  occur..  */.  if
354d0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
354e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
354f0 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
35500 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 43 75 72 73  ->db, pBt->pCurs
35510 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b  or->pBtree->db);
35520 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
35530 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
35540 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  CACHE;.  }..  rc
35550 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
35560 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
35570 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65  o)iTable, &pPage
35580 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
35590 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
355a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
355b0 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61  learTable(p, iTa
355c0 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ble, 0);.  if( r
355d0 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  c ){.    release
355e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
355f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
35600 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b  .  *piMoved = 0;
35610 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31  ..  if( iTable>1
35620 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
35630 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
35640 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  M.    rc = freeP
35650 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
35660 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
35670 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  e);.#else.    if
35680 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
35690 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  m ){.      Pgno 
356a0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
356b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
356c0 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34  treeGetMeta(p, 4
356d0 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  , &maxRootPgno);
356e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
356f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35700 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35710 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35720 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
35730 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54   }..      if( iT
35740 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e  able==maxRootPgn
35750 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
35760 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  If the table bei
35770 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68  ng dropped is th
35780 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
35790 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
357a0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
357b0 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
357c0 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f  base, put the ro
357d0 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66  ot page on the f
357e0 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ree list. .     
357f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
35800 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
35810 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
35820 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
35830 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35850 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
35860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35880 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
35890 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73  ing dropped does
358a0 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61   not have the la
358b0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
358c0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
358d0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
358e0 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70  e. So move the p
358f0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e  age that does in
35900 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
35910 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74  ** gap left by t
35920 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d  he deleted root-
35930 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
35940 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
35950 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20   *pMove;.       
35960 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
35970 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ge);.        rc 
35980 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
35990 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f  tPage(pBt, maxRo
359a0 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20  otPgno, &pMove, 
359b0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
359c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
359d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
359e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
359f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
35a00 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
35a10 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Move, PTRMAP_ROO
35a20 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65  TPAGE, 0, iTable
35a30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
35a40 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
35a50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35a60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35a70 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
35a80 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
35a90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35aa0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
35ab0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
35ac0 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
35ad0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
35ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35af0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35b10 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
35b20 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Move);.        r
35b30 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
35b40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
35b50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35b60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
35b70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
35b80 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20         *piMoved 
35b90 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  = maxRootPgno;. 
35ba0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
35bb0 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61   Set the new 'ma
35bc0 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c  x-root-page' val
35bd0 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ue in the databa
35be0 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a  se header. This.
35bf0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
35c00 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f  old value less o
35c10 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72  ne, less one mor
35c20 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e  e if that happen
35c30 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
35c40 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d   a root-page num
35c50 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67  ber, less one ag
35c60 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74  ain if that is t
35c70 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44  he.      ** PEND
35c80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20  ING_BYTE_PAGE.. 
35c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61       */.      ma
35ca0 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
35cb0 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
35cc0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
35cd0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
35ce0 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
35cf0 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
35d00 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
35d10 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  no==PTRMAP_PAGEN
35d20 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  O(pBt, maxRootPg
35d30 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  no) ){.        m
35d40 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
35d50 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
35d60 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21  rt( maxRootPgno!
35d70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
35d80 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  GE(pBt) );..    
35d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
35da0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
35db0 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29   4, maxRootPgno)
35dc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35dd0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
35de0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  (pPage);.      r
35df0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
35e00 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
35e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
35e20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  If sqlite3BtreeD
35e30 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c  ropTable was cal
35e40 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  led on page 1. *
35e50 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  /.    zeroPage(p
35e60 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59  Page, PTF_INTKEY
35e70 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20  |PTF_LEAF );.   
35e80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
35e90 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
35ea0 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71  n rc;  .}.int sq
35eb0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
35ec0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
35ed0 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
35ee0 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
35ef0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
35f00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
35f10 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65  = btreeDropTable
35f20 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f  (p, iTable, piMo
35f30 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ved);.  sqlite3B
35f40 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
35f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
35f60 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65  *.** Read the me
35f70 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ta-information o
35f80 75 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ut of a database
35f90 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a   file.  Meta[0].
35fa0 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
35fb0 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63   of free pages c
35fc0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
35fd0 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
35fe0 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65  1].** through me
35ff0 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c  ta[15] are avail
36000 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20  able for use by 
36010 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20  higher layers.  
36020 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65  Meta[0].** is re
36030 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68  ad-only, the oth
36040 65 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  ers are read/wri
36050 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73  te..** .** The s
36060 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62  chema layer numb
36070 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20  ers meta values 
36080 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74  differently.  At
36090 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c   the schema.** l
360a0 61 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65  ayer (and the Se
360b0 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64  tCookie and Read
360c0 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20  Cookie opcodes) 
360d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
360e0 20 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e   free pages is n
360f0 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20  ot visible.  So 
36100 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65  Cookie[0] is the
36110 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d   same as Meta[1]
36120 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36130 42 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72  BtreeGetMeta(Btr
36140 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
36150 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44  u32 *pMeta){.  D
36160 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 3d  bPage *pDbPage =
36170 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
36180 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
36190 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  P1;.  BtShared *
361a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
361b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
361c0 65 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  er(p);..  /* Rea
361d0 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61  ding a meta-data
361e0 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20   value requires 
361f0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  a read-lock on p
36200 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65  age 1 (and hence
36210 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
36220 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57  _master table. W
36230 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b  e grab this lock
36240 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
36250 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e  hether or.  ** n
36260 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65  ot the SQLITE_Re
36270 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
36280 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74  ag is set (the t
36290 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
362a0 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72  age.  ** 1 is tr
362b0 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69  eated as a speci
362c0 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79  al case by query
362d0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
362e0 4c 6f 63 6b 28 29 0a 20 20 2a 2a 20 61 6e 64 20  Lock().  ** and 
362f0 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
36300 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 20 20 2a 2f  bleLock())..  */
36310 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
36320 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
36330 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  k(p, 1, READ_LOC
36340 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
36350 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
36360 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
36370 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
36380 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
36390 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
363a0 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20 70 42  <=15 );.  if( pB
363b0 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20  t->pPage1 ){.   
363c0 20 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20 69   /* The b-tree i
363d0 73 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e  s already holdin
363e0 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
363f0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
36400 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
36410 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ile. In this cas
36420 65 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6d  e the required m
36430 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 63  eta-data value c
36440 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
36450 74 6c 79 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  tly.    ** from 
36460 74 68 65 20 70 61 67 65 20 64 61 74 61 20 6f 66  the page data of
36470 20 74 68 69 73 20 72 65 66 65 72 65 6e 63 65 2e   this reference.
36480 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c   This is slightl
36490 79 20 66 61 73 74 65 72 20 74 68 61 6e 0a 20 20  y faster than.  
364a0 20 20 2a 2a 20 72 65 71 75 65 73 74 69 6e 67 20    ** requesting 
364b0 61 20 6e 65 77 20 72 65 66 65 72 65 6e 63 65 20  a new reference 
364c0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
364d0 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ayer..    */.   
364e0 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64   pP1 = (unsigned
364f0 20 63 68 61 72 20 2a 29 70 42 74 2d 3e 70 50 61   char *)pBt->pPa
36500 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 7d 65  ge1->aData;.  }e
36510 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
36520 62 2d 74 72 65 65 20 64 6f 65 73 20 6e 6f 74 20  b-tree does not 
36530 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65  have a reference
36540 20 74 6f 20 70 61 67 65 20 31 20 6f 66 20 74 68   to page 1 of th
36550 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
36560 0a 20 20 20 20 2a 2a 20 4f 62 74 61 69 6e 20 6f  .    ** Obtain o
36570 6e 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ne from the page
36580 72 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a  r layer..    */.
36590 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
365a0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
365b0 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67  ager, 1, &pDbPag
365c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
365d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
365e0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
365f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36600 20 20 20 7d 0a 20 20 20 20 70 50 31 20 3d 20 28     }.    pP1 = (
36610 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
36620 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
36630 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
36640 7d 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74  }.  *pMeta = get
36650 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20  4byte(&pP1[36 + 
36660 69 64 78 2a 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49  idx*4]);..  /* I
36670 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  f the b-tree is 
36680 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 72 65  not holding a re
36690 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
366a0 31 2c 20 74 68 65 6e 20 6f 6e 65 20 77 61 73 20  1, then one was 
366b0 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
366c0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
366d0 61 79 65 72 20 69 6e 20 74 68 65 20 61 62 6f 76  ayer in the abov
366e0 65 20 62 6c 6f 63 6b 2e 20 52 65 6c 65 61 73 65  e block. Release
366f0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
36700 69 66 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  if( !pBt->pPage1
36710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
36720 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
36730 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
36740 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73   autovacuumed is
36750 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69   disabled in thi
36760 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20 61  s build but we a
36770 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20  re trying to .  
36780 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75 74  ** access an aut
36790 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61  ovacuumed databa
367a0 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68  se, then make th
367b0 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64 6f  e database reado
367c0 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65  nly. .  */.#ifde
367d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
367e0 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69  TOVACUUM.  if( i
367f0 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e  dx==4 && *pMeta>
36800 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  0 ) pBt->readOnl
36810 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20  y = 1;.#endif.. 
36820 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
36830 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 6f 70 65  currently an ope
36840 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 67  n transaction, g
36850 72 61 62 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  rab a read-lock 
36860 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 20  .  ** on page 1 
36870 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
36880 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
36890 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
368a0 74 68 61 74 0a 20 20 2a 2a 20 6e 6f 20 6f 74 68  that.  ** no oth
368b0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61  er connection ca
368c0 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6d 65 74  n modify the met
368d0 61 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  a value just rea
368e0 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
368f0 64 61 74 61 62 61 73 65 20 75 6e 74 69 6c 20 74  database until t
36900 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
36910 73 20 63 6f 6e 63 6c 75 64 65 64 2e 0a 20 20 2a  s concluded..  *
36920 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
36930 6e 73 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  ns>0 ){.    rc =
36940 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
36950 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52  ableLock(p, 1, R
36960 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20  EAD_LOCK);.  }. 
36970 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
36980 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
36990 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
369a0 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  te meta-informat
369b0 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ion back into th
369c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
369d0 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d  a[0] is.** read-
369e0 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74  only and may not
369f0 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a   be written..*/.
36a00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
36a10 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65  UpdateMeta(Btree
36a20 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33   *p, int idx, u3
36a30 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68  2 iMeta){.  BtSh
36a40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
36a50 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
36a60 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20  har *pP1;.  int 
36a70 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
36a80 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=1 && idx<=15 
36a90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
36aa0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
36ab0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
36ac0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
36ad0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
36ae0 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50  Page1!=0 );.  pP
36af0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  1 = pBt->pPage1-
36b00 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
36b10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36b20 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
36b30 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
36b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36b50 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 31     put4byte(&pP1
36b60 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d  [36 + idx*4], iM
36b70 65 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  eta);.#ifndef SQ
36b80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
36b90 43 55 55 4d 0a 20 20 20 20 69 66 28 20 69 64 78  CUUM.    if( idx
36ba0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
36bb0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
36bc0 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30  cuum || iMeta==0
36bd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
36be0 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d  ( iMeta==0 || iM
36bf0 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  eta==1 );.      
36c00 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
36c10 3d 20 28 75 38 29 69 4d 65 74 61 3b 0a 20 20 20  = (u8)iMeta;.   
36c20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
36c30 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
36c40 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
36c50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
36c60 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65  rn the flag byte
36c70 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
36c80 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  g of the page th
36c90 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
36ca0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
36cb0 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
36cc0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c  t sqlite3BtreeFl
36cd0 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ags(BtCursor *pC
36ce0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
36cf0 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f  What about CURSO
36d00 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
36d10 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65  ate? Probably ne
36d20 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20  ed to call.  ** 
36d30 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
36d40 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
36d50 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
36d60 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43 75  age;.  restoreCu
36d70 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
36d80 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  r);.  pPage = pC
36d90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
36da0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
36db0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
36dc0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
36dd0 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20  ssert( pPage!=0 
36de0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36df0 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70  ge->pBt==pCur->p
36e00 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Bt );.  return p
36e10 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
36e20 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 3b 0a 7d  e->hdrOffset];.}
36e30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
36e40 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
36e50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
36e60 20 61 72 67 75 6d 65 6e 74 2c 20 70 43 75 72 2c   argument, pCur,
36e70 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65   is a cursor ope
36e80 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 62 2d 74 72  ned on some b-tr
36e90 65 65 2e 20 43 6f 75 6e 74 20 74 68 65 0a 2a 2a  ee. Count the.**
36ea0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
36eb0 65 73 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  es in the b-tree
36ec0 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 72   and write the r
36ed0 65 73 75 6c 74 20 74 6f 20 2a 70 6e 45 6e 74 72  esult to *pnEntr
36ee0 79 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  y..**.** SQLITE_
36ef0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
36f00 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
36f10 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
36f20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 4f 74  executed. .** Ot
36f30 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
36f40 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
36f50 72 65 64 20 28 69 2e 65 2e 20 61 6e 20 49 4f 20  red (i.e. an IO 
36f60 65 72 72 6f 72 20 6f 72 20 64 61 74 61 62 61 73  error or databas
36f70 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 29  e.** corruption)
36f80 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
36f90 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
36fa0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
36fb0 33 42 74 72 65 65 43 6f 75 6e 74 28 42 74 43 75  3BtreeCount(BtCu
36fc0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
36fd0 2a 70 6e 45 6e 74 72 79 29 7b 0a 20 20 69 36 34  *pnEntry){.  i64
36fe0 20 6e 45 6e 74 72 79 20 3d 20 30 3b 20 20 20 20   nEntry = 0;    
36ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37000 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
37010 74 75 72 6e 20 69 6e 20 2a 70 6e 45 6e 74 72 79  turn in *pnEntry
37020 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
37030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37050 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 72  turn code */.  r
37060 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
37070 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65  Cur);..  /* Unle
37080 73 73 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ss an error occu
37090 72 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rs, the followin
370a0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 65 20  g loop runs one 
370b0 69 74 65 72 61 74 69 6f 6e 20 66 6f 72 20 65 61  iteration for ea
370c0 63 68 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  ch.  ** page in 
370d0 74 68 65 20 42 2d 54 72 65 65 20 73 74 72 75 63  the B-Tree struc
370e0 74 75 72 65 20 28 6e 6f 74 20 69 6e 63 6c 75 64  ture (not includ
370f0 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
37100 65 73 29 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  es). .  */.  whi
37110 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
37120 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  K ){.    int iId
37130 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
37140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
37150 6e 64 65 78 20 6f 66 20 63 68 69 6c 64 20 6e 6f  ndex of child no
37160 64 65 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  de in parent */.
37170 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
37180 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
37190 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
371a0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
371b0 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  tree */..    /* 
371c0 49 66 20 74 68 69 73 20 69 73 20 61 20 6c 65 61  If this is a lea
371d0 66 20 70 61 67 65 20 6f 72 20 74 68 65 20 74 72  f page or the tr
371e0 65 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  ee is not an int
371f0 2d 6b 65 79 20 74 72 65 65 2c 20 74 68 65 6e 20  -key tree, then 
37200 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 70 61 67  .    ** this pag
37210 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 75 6e 74  e contains count
37220 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 49 6e  able entries. In
37230 63 72 65 6d 65 6e 74 20 74 68 65 20 65 6e 74 72  crement the entr
37240 79 20 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a  y counter.    **
37250 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 20 20   accordingly..  
37260 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 20 3d    */.    pPage =
37270 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
37280 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
37290 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
372a0 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || !pPage->intKe
372b0 79 20 29 7b 0a 20 20 20 20 20 20 6e 45 6e 74 72  y ){.      nEntr
372c0 79 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  y += pPage->nCel
372d0 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  l;.    }..    /*
372e0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
372f0 20 6e 6f 64 65 2e 20 54 68 69 73 20 6c 6f 6f 70   node. This loop
37300 20 6e 61 76 69 67 61 74 65 73 20 74 68 65 20 63   navigates the c
37310 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
37320 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20   .    ** points 
37330 74 6f 20 74 68 65 20 66 69 72 73 74 20 69 6e 74  to the first int
37340 65 72 69 6f 72 20 63 65 6c 6c 20 74 68 61 74 20  erior cell that 
37350 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
37360 20 70 61 72 65 6e 74 20 6f 66 0a 20 20 20 20 2a   parent of.    *
37370 2a 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  * the next page 
37380 69 6e 20 74 68 65 20 74 72 65 65 20 74 68 61 74  in the tree that
37390 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
373a0 6e 20 76 69 73 69 74 65 64 2e 20 54 68 65 0a 20  n visited. The. 
373b0 20 20 20 2a 2a 20 70 43 75 72 2d 3e 61 69 49 64     ** pCur->aiId
373c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 76  x[pCur->iPage] v
373d0 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74  alue is set to t
373e0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
373f0 70 61 72 65 6e 74 20 63 65 6c 6c 0a 20 20 20 20  parent cell.    
37400 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
37410 6f 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  or to the number
37420 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 74 68 65   of cells in the
37430 20 70 61 67 65 20 69 66 20 74 68 65 20 6e 65 78   page if the nex
37440 74 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 6f  t page.    ** to
37450 20 76 69 73 69 74 20 69 73 20 74 68 65 20 72 69   visit is the ri
37460 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 69 74 73  ght-child of its
37470 20 70 61 72 65 6e 74 2e 0a 20 20 20 20 2a 2a 0a   parent..    **.
37480 20 20 20 20 2a 2a 20 49 66 20 61 6c 6c 20 70 61      ** If all pa
37490 67 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  ges in the tree 
374a0 68 61 76 65 20 62 65 65 6e 20 76 69 73 69 74 65  have been visite
374b0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
374c0 5f 4f 4b 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  _OK to the.    *
374d0 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2f  * caller..    */
374e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
374f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 64 6f  leaf ){.      do
37500 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
37510 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
37520 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
37530 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 62  l pages of the b
37540 2d 74 72 65 65 20 68 61 76 65 20 62 65 65 6e 20  -tree have been 
37550 76 69 73 69 74 65 64 2e 20 52 65 74 75 72 6e 20  visited. Return 
37560 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 2a 2f  successfully. */
37570 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 45 6e  .          *pnEn
37580 74 72 79 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20  try = nEntry;.  
37590 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
375a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
375b0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
375c0 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
375d0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
375e0 20 20 7d 77 68 69 6c 65 20 28 20 70 43 75 72 2d    }while ( pCur-
375f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
37600 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]>=pCur->apPag
37610 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
37620 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 20 20  nCell );..      
37630 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
37640 2d 3e 69 50 61 67 65 5d 2b 2b 3b 0a 20 20 20 20  ->iPage]++;.    
37650 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
37660 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
37670 67 65 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge];.    }..    
37680 2f 2a 20 44 65 73 63 65 6e 64 20 74 6f 20 74 68  /* Descend to th
37690 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 6f 66 20  e child node of 
376a0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 74 68  the cell that th
376b0 65 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  e cursor current
376c0 6c 79 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ly .    ** point
376d0 73 20 61 74 2e 20 54 68 69 73 20 69 73 20 74 68  s at. This is th
376e0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 66  e right-child if
376f0 20 28 69 49 64 78 3d 3d 70 50 61 67 65 2d 3e 6e   (iIdx==pPage->n
37700 43 65 6c 6c 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  Cell)..    */.  
37710 20 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61    iIdx = pCur->a
37720 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
37730 5d 3b 0a 20 20 20 20 69 66 28 20 69 49 64 78 3d  ];.    if( iIdx=
37740 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
37750 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
37760 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
37770 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
37780 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
37790 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
377a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
377b0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
377c0 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
377d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 49 64  dCell(pPage, iId
377e0 78 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  x)));.    }.  }.
377f0 0a 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68  .  /* An error h
37800 61 73 20 6f 63 63 75 72 72 65 64 2e 20 52 65 74  as occurred. Ret
37810 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
37820 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  e. */.  return r
37830 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
37840 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
37850 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
37860 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68  ith a BTree.  Th
37870 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
37880 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
37890 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
378a0 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a  only..*/.Pager *
378b0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
378c0 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  r(Btree *p){.  r
378d0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50  eturn p->pBt->pP
378e0 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ager;.}..#ifndef
378f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
37900 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
37910 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
37920 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
37930 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
37940 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
37950 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
37960 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
37970 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
37980 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
37990 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
379a0 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
379b0 61 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63  ap;.  if( !pChec
379c0 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72  k->mxErr ) retur
379d0 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45  n;.  pCheck->mxE
379e0 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  rr--;.  pCheck->
379f0 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61  nErr++;.  va_sta
37a00 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
37a10 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65  .  if( pCheck->e
37a20 72 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20  rrMsg.nChar ){. 
37a30 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
37a40 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b  umAppend(&pCheck
37a50 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20  ->errMsg, "\n", 
37a60 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  1);.  }.  if( zM
37a70 73 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sg1 ){.    sqlit
37a80 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
37a90 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  (&pCheck->errMsg
37aa0 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20  , zMsg1, -1);.  
37ab0 7d 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69  }.  sqlite3VXPri
37ac0 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72  ntf(&pCheck->err
37ad0 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c  Msg, 1, zFormat,
37ae0 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
37af0 70 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  p);.  if( pCheck
37b00 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46  ->errMsg.mallocF
37b10 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43 68  ailed ){.    pCh
37b20 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  eck->mallocFaile
37b30 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d = 1;.  }.}.#en
37b40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
37b50 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
37b60 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
37b70 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
37b80 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
37b90 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65   Add 1 to the re
37ba0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
37bb0 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49  r page iPage.  I
37bc0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  f this is the se
37bd0 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63  cond.** referenc
37be0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61  e to the page, a
37bf0 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
37c00 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a  age to pCheck->z
37c10 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72  ErrMsg..** Retur
37c20 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65  n 1 if there are
37c30 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65   2 ore more refe
37c40 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
37c50 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69  ge and 0 if.** i
37c60 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
37c70 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  rst reference to
37c80 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
37c90 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
37ca0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
37cb0 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a   is in bounds..*
37cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
37cd0 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43  ckRef(IntegrityC
37ce0 6b 20 2a 70 43 68 65 63 6b 2c 20 50 67 6e 6f 20  k *pCheck, Pgno 
37cf0 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f  iPage, char *zCo
37d00 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50  ntext){.  if( iP
37d10 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
37d20 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70  1;.  if( iPage>p
37d30 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 29 7b 0a  Check->nPage ){.
37d40 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
37d50 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
37d60 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61  ext, "invalid pa
37d70 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69  ge number %d", i
37d80 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
37d90 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
37da0 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
37db0 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68  ge]==1 ){.    ch
37dc0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
37dd0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
37de0 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f  2nd reference to
37df0 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
37e00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
37e10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28  .  }.  return  (
37e20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
37e30 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69  age]++)>1;.}..#i
37e40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37e50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
37e60 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
37e70 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  e entry in the p
37e80 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70  ointer-map for p
37e90 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20  age iChild maps 
37ea0 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72  to .** page iPar
37eb0 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70  ent, pointer typ
37ec0 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f  e ptrType. If no
37ed0 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72  t, append an err
37ee0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f  or message.** to
37ef0 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74   pCheck..*/.stat
37f00 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72  ic void checkPtr
37f10 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79  map(.  Integrity
37f20 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a  Ck *pCheck,   /*
37f30 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
37f40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67   context */.  Pg
37f50 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
37f60 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61       /* Child pa
37f70 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75  ge number */.  u
37f80 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
37f90 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
37fa0 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79  d pointer map ty
37fb0 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61  pe */.  Pgno iPa
37fc0 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f  rent,          /
37fd0 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
37fe0 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61  er map parent pa
37ff0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
38000 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
38010 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
38020 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73   description (us
38030 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67  ed for error msg
38040 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
38050 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79  ;.  u8 ePtrmapTy
38060 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d  pe;.  Pgno iPtrm
38070 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20  apParent;..  rc 
38080 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65  = ptrmapGet(pChe
38090 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c  ck->pBt, iChild,
380a0 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26   &ePtrmapType, &
380b0 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
380c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
380d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
380e0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
380f0 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63  ) pCheck->malloc
38100 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
38110 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
38120 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
38130 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64   "Failed to read
38140 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c   ptrmap key=%d",
38150 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65   iChild);.    re
38160 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
38170 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54   ePtrmapType!=eT
38180 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61  ype || iPtrmapPa
38190 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b  rent!=iParent ){
381a0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
381b0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
381c0 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61  text, .      "Ba
381d0 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20  d ptr map entry 
381e0 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d  key=%d expected=
381f0 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c  (%d,%d) got=(%d,
38200 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68  %d)", .      iCh
38210 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72  ild, eType, iPar
38220 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65  ent, ePtrmapType
38230 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29  , iPtrmapParent)
38240 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
38250 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
38260 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
38270 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20   freelist or of 
38280 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
38290 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79   list..** Verify
382a0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
382b0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
382c0 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73   list is N..*/.s
382d0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
382e0 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74  List(.  Integrit
382f0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
38300 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
38310 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
38320 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c   int isFreeList,
38330 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
38340 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20  or a freelist.  
38350 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c  False for overfl
38360 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ow page list */.
38370 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
38380 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
38390 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74  number for first
383a0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
383b0 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
383c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
383d0 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  Expected number 
383e0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
383f0 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
38400 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
38410 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65  /* Context for e
38420 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
38430 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
38440 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b  nt expected = N;
38450 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
38460 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20  iPage;.  while( 
38470 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63  N-- > 0 && pChec
38480 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20  k->mxErr ){.    
38490 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61