/ Hex Artifact Content
Login

Artifact 1201cba9e4ccd029a2b88431d14e315c086af6ba:


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 36 30 34 20 32 30 30 39 2f 30  c,v 1.604 2009/0
0190: 35 2f 30 32 20 30 37 3a 33 36 3a 35 30 20 64 61  5/02 07:36:50 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 73 74 61 74 69 63 20 75  ter..*/.static u
5f80: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
5f90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
5fa0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
5fb0: 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b  *pIter = &pCell[
5fc0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
5fd0: 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a  ize];.  u32 nSiz
5fe0: 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
5ff0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
6000: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
6010: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
6020: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
6030: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
6040: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
6050: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
6060: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
6070: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
6080: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
6090: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
60a0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
60b0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
60c0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
60d0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
60e0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
60f0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
6100: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
6110: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
6120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6130: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
6140: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
6150: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
6160: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
6170: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
6180: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
6190: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
61a0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
61b0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
61c0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
61d0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
61e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
61f0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
6200: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
6210: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
6220: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
6230: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
6240: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
6250: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
6260: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
6270: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
6280: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
6290: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
62a0: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
62b0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
62c0: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
62d0: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
62e0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
62f0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
6300: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
6310: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
6320: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
6330: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
6340: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
6350: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
6360: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
6370: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
6380: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
6390: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
63a0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
63b0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
63c0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
63d0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
63e0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
63f0: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
6400: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 70 49 74  .  nSize += (pIt
6410: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20  er - pCell);..  
6420: 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  /* The minimum s
6430: 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20  ize of any cell 
6440: 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  is 4 bytes. */. 
6450: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a   if( nSize<4 ){.
6460: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20      nSize = 4;. 
6470: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53   }..  assert( nS
6480: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
6490: 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Size );.  return
64a0: 20 6e 53 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65   nSize;.}.#ifnde
64b0: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
64c0: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
64d0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
64e0: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
64f0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  n cellSizePtr(pP
6500: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
6510: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
6520: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6540: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
6550: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
6560: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
6570: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
6580: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
6590: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
65a0: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
65b0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
65c0: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
65d0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
65e0: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
65f0: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
6600: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
6610: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
6620: 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72  fo info;.  asser
6630: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
6640: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6650: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
6660: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
6670: 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
6680: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
6690: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
66a0: 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
66b0: 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e 66 6f  d );.  if( (info
66c0: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
66d0: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
66e0: 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
66f0: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
6700: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
6710: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
6720: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
6730: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
6740: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
6750: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
6760: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
6770: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6780: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
6790: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
67a0: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
67b0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
67c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
67d0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
67e0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
67f0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6800: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
6810: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
6820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6830: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
6840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6850: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
6860: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
6870: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6880: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
6890: 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c  utex) );.  pCell
68a0: 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
68b0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
68c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d  );.  return ptrm
68d0: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
68e0: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65  ge, pCell);.}.#e
68f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
6900: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
6910: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
6920: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
6930: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
6940: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
6950: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
6960: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
6970: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
6980: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
6990: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
69a0: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
69b0: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
69c0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
69d0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
69e0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
69f0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
6a00: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
6a30: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
6a60: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
6a70: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
6a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6a90: 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62 79  fset of first by
6aa0: 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f  te after cell po
6ab0: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
6ac0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6ae0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
6af0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
6b00: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
6b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
6b20: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
6b30: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
6b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6b50: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
6b60: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
6b70: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
6b80: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
6b90: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
6ba0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
6bb0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
6bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6bd0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6be0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6bf0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
6c00: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
6c10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c20: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
6c30: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
6c40: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
6c50: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
6c60: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
6c70: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
6c80: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
6c90: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
6ca0: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
6cb0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
6cc0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
6cd0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
6ce0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
6cf0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
6d00: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
6d10: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
6d20: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
6d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6d40: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
6d50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
6d60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6d70: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6d80: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
6d90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
6da0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
6db0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
6dc0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
6dd0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
6de0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
6df0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
6e00: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
6e10: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
6e20: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
6e30: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
6e40: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
6e50: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
6e60: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
6e70: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
6e80: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6e90: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
6ea0: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
6eb0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
6ec0: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
6ed0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
6ee0: 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Size;.  for(i=0;
6ef0: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
6f00: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
6f10: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
6f20: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
6f30: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
6f40: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
6f50: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
6f60: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
6f70: 20 20 69 66 28 20 70 63 3e 3d 75 73 61 62 6c 65    if( pc>=usable
6f80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
6f90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6fa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
6fb0: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
6fc0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
6fd0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
6fe0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
6ff0: 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c 4f 66 66  if( cbrk<cellOff
7000: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c 20 70  set+2*nCell || p
7010: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
7020: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
7030: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7040: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
7050: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
7060: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
7070: 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a 20 20 20  & cbrk>=0 );.   
7080: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
7090: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
70a0: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
70b0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
70c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
70d0: 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74  cbrk>=cellOffset
70e0: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
70f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7100: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
7110: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
7120: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
7130: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
7140: 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65  = 0;.  addr = ce
7150: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
7160: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
7170: 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72 6b 2d  [addr], 0, cbrk-
7180: 61 64 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  addr);.  assert(
7190: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
71a0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
71b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
71c0: 28 20 63 62 72 6b 2d 61 64 64 72 21 3d 70 50 61  ( cbrk-addr!=pPa
71d0: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
71e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
71f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
7200: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7210: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
7220: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
7230: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
7240: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
7250: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
7260: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
7270: 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
7280: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
7290: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66  Page->aData[] of
72a0: 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 62   the .** first b
72b0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
72c0: 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a 2a 20 54   space. .**.** T
72d0: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
72e0: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 73 70  tees that the sp
72f0: 61 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  ace between the 
7300: 65 6e 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  end of the cell-
7310: 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72 72 61 79  offset .** array
7320: 20 61 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f   and the start o
7330: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
7340: 6e 74 20 61 72 65 61 20 69 73 20 61 74 20 6c 65  nt area is at le
7350: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 0a  ast nByte bytes.
7360: 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53 6f 20 74  ** in size. So t
7370: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
7380: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  never fail..**.*
7390: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
73a0: 6c 72 65 61 64 79 20 36 30 20 6f 72 20 6d 6f 72  lready 60 or mor
73b0: 65 20 62 79 74 65 73 20 6f 66 20 66 72 61 67 6d  e bytes of fragm
73c0: 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20  ents within the 
73d0: 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20 70 61 67  page,.** the pag
73e0: 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
73f0: 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
7400: 6e 67 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  ng. If this were
7410: 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65 72 65 0a   not done there.
7420: 2a 2a 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  ** is a chance t
7430: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
7440: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
7450: 65 73 20 63 6f 75 6c 64 20 65 76 65 6e 74 75 61  es could eventua
7460: 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  lly .** overflow
7470: 20 74 68 65 20 73 69 6e 67 6c 65 2d 62 79 74 65   the single-byte
7480: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
7490: 67 65 2d 68 65 61 64 65 72 20 69 6e 20 77 68 69  ge-header in whi
74a0: 63 68 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  ch this value.**
74b0: 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 73   is stored..*/.s
74c0: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
74d0: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
74e0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
74f0: 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  e){.  const int 
7500: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
7510: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
7520: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
7530: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
7540: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
7550: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7560: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
7570: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
7580: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
7590: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
75c0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
75d0: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
75e0: 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73 73 65 72   top;.  .  asser
75f0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
7600: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
7610: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7620: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
7630: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
7640: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7650: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7660: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
7670: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
7680: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
7690: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
76a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
76b0: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
76c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
76d0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
76e0: 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
76f0: 20 74 68 65 20 73 70 61 63 65 20 62 65 74 77 65   the space betwe
7700: 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73  en the cell-offs
7710: 65 74 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  et array and the
7720: 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63 6f 6e 74   .  ** cell-cont
7730: 65 6e 74 20 61 72 65 61 20 69 73 20 67 72 65 61  ent area is grea
7740: 74 65 72 20 74 68 61 6e 20 6e 42 79 74 65 20 62  ter than nByte b
7750: 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ytes..  */.  ass
7760: 65 72 74 28 20 6e 42 79 74 65 20 3c 3d 20 28 0a  ert( nByte <= (.
7770: 20 20 20 20 20 20 67 65 74 32 62 79 74 65 28 26        get2byte(&
7780: 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d 28 68 64  data[hdr+5])-(hd
7790: 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  r+8+(pPage->leaf
77a0: 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62 79 74 65  ?0:4)+2*get2byte
77b0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 29 0a  (&data[hdr+3])).
77c0: 20 20 29 29 3b 0a 0a 20 20 70 50 61 67 65 2d 3e    ));..  pPage->
77d0: 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 6e 42  nFree -= (u16)nB
77e0: 79 74 65 3b 0a 20 20 6e 46 72 61 67 20 3d 20 64  yte;.  nFrag = d
77f0: 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66  ata[hdr+7];.  if
7800: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
7810: 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67     defragmentPag
7820: 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
7830: 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
7840: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
7850: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
7860: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
7870: 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20   to satisfy .   
7880: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e   ** the request.
7890: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
78a0: 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65  is made from the
78b0: 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74   first free slot
78c0: 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
78d0: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72  list that is lar
78e0: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63  ge enough to acc
78f0: 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20  omadate it..    
7900: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
7910: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
7920: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
7930: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
7940: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
7950: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
7960: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
7970: 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f  ta[pc+2]);     /
7980: 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73  * Size of free s
7990: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
79a0: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
79b0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
79c0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
79d0: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
79e0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
79f0: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
7a00: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
7a10: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
7a20: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
7a30: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
7a40: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
7a50: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
7a60: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
7a70: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
7a80: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
7a90: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
7aa0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
7ab0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
7ad0: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
7ae0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
7af0: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
7b00: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
7b10: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
7b20: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
7b30: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
7b40: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
7b50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
7b60: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
7b70: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
7b80: 6e 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20  n pc + x;.      
7b90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
7ba0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
7bb0: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
7bc0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
7bd0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
7be0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
7bf0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
7c00: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  .  */.  top = ge
7c10: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7c20: 2b 35 5d 29 20 2d 20 6e 42 79 74 65 3b 0a 20 20  +5]) - nByte;.  
7c30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
7c40: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
7c50: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
7c60: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
7c70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
7c80: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
7c90: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
7ca0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
7cb0: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
7cc0: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
7cd0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
7ce0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
7cf0: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
7d00: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
7d10: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
7d20: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
7d30: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
7d40: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
7d50: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
7d60: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
7d70: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
7d80: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
7d90: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
7da0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
7db0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
7dc0: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73  egin, hdr;.  uns
7dd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7de0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
7df0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
7e00: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
7e10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7e20: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
7e30: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7e40: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
7e50: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
7e60: 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
7e70: 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73  af?0:4) );.  ass
7e80: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
7e90: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
7ea0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
7eb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7ec0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
7ed0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
7ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
7ef0: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
7f00: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
7f10: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
7f20: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
7f30: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
7f40: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
7f50: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
7f60: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
7f70: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
7f80: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
7f90: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7fa0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
7fb0: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
7fc0: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
7fd0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
7fe0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
7ff0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
8000: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20  blocks */.  hdr 
8010: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
8020: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
8030: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
8040: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
8050: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
8060: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
8070: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
8080: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
8090: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
80a0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  4 );.    if( pbe
80b0: 67 69 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20  gin<=addr ) {.  
80c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
80d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
80e0: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d      }.    addr =
80f0: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69   pbegin;.  }.  i
8100: 66 20 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65  f ( pbegin>pPage
8110: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8120: 65 2d 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75  e-4 ) {.    retu
8130: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8140: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
8150: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
8160: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
8170: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
8180: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
8190: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
81a0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
81b0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
81c0: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
81d0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
81e0: 46 72 65 65 20 2b 3d 20 28 75 31 36 29 73 69 7a  Free += (u16)siz
81f0: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
8200: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
8210: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
8220: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
8230: 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  set + 1;.  while
8240: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
8250: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
8260: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
8270: 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b  pnext, psize, x;
8280: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
8290: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
82a0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
82b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
82c0: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
82d0: 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65  pnext = get2byte
82e0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b  (&data[pbegin]);
82f0: 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74  .    psize = get
8300: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
8310: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  in+2]);.    if( 
8320: 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b  pbegin + psize +
8330: 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70   3 >= pnext && p
8340: 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
8350: 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74  int frag = pnext
8360: 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65   - (pbegin+psize
8370: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72  );.      if( (fr
8380: 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28  ag<0) || (frag>(
8390: 69 6e 74 29 64 61 74 61 5b 70 50 61 67 65 2d 3e  int)data[pPage->
83a0: 68 64 72 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b  hdrOffset+7]) ){
83b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
83c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
83d0: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
83e0: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
83f0: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28  drOffset+7] -= (
8400: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
8410: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8420: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
8430: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
8440: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
8450: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
8460: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
8470: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
8480: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
8490: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
84a0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
84b0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
84c0: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
84d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
84e0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
84f0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
8500: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
8510: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
8520: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
8530: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
8540: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
8550: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
8560: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
8570: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8580: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
8590: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
85a0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
85b0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
85c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
85d0: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
85e0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
85f0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
8600: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
8610: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
8620: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
8630: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
8640: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
8650: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8660: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
8670: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
8680: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
8690: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
86a0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
86b0: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
86c0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
86d0: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
86e0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
86f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
8700: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
8710: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
8720: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
8730: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
8740: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
8750: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
8760: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
8770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
8780: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
8790: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
87a0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
87b0: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
87c0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
87d0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
87e0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
87f0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
8800: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
8810: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
8820: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
8830: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
8840: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
8850: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
8860: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
8870: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
8880: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
8890: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
88a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
88b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
88c0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
88d0: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
88e0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
88f0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
8900: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
8910: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
8920: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
8930: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
8940: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
8950: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
8960: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
8970: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
8980: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
8990: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
89a0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
89b0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
89c0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
89d0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
89e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
89f0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
8a00: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
8a10: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
8a20: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
8a30: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
8a40: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
8a50: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
8a60: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
8a70: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
8a80: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
8a90: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
8aa0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
8ab0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8ac0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8ad0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8ae0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
8af0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
8b00: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
8b10: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
8b20: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
8b30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
8b40: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
8b50: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
8b60: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
8b70: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
8b80: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
8b90: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
8ba0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
8bb0: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
8bc0: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
8bd0: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
8be0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
8bf0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
8c00: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
8c10: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
8c20: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
8c30: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
8c40: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
8c50: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d  3BtreeInitPage(M
8c60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
8c70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8c80: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
8c90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8ca0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8cb0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8cc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8cd0: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
8ce0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
8cf0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
8d00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
8d10: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
8d20: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
8d30: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8d40: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
8d50: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
8d60: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
8d70: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
8d80: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
8d90: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8db0: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
8dc0: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
8dd0: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
8de0: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
8df0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8e00: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
8e10: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8e20: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
8e30: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
8e40: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
8e50: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
8e60: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
8e70: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
8e80: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
8e90: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
8ea0: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
8eb0: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
8ec0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
8ed0: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
8ee0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
8ef0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
8f00: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
8f10: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
8f20: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
8f30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
8f40: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
8f50: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
8f60: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
8f70: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
8f80: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8f90: 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70  t area */..    p
8fa0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
8fb0: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
8fc0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
8fd0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
8fe0: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
8ff0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
9000: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
9010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9020: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
9030: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
9040: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
9050: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36  ->pageSize<=3276
9060: 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  8 );.    pPage->
9070: 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e  maskPage = pBt->
9080: 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20  pageSize - 1;.  
9090: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
90a0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
90b0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
90c0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
90d0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
90e0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
90f0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
9100: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70  e->leaf;.    top
9110: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9120: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
9130: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
9140: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9150: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
9160: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
9170: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
9180: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
9190: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
91a0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
91b0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
91c0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
91d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
91e0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
91f0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
9200: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
9210: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
9220: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
9230: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
9240: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
9250: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d  a[hdr+7] + top -
9260: 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32   (cellOffset + 2
9270: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pPage->nCell);.
9280: 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20      while( pc>0 
9290: 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78  ){.      u16 nex
92a0: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  t, size;.      i
92b0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
92c0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -4 ){.        /*
92d0: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
92e0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
92f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9300: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9310: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
9320: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
9330: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
9340: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
9350: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
9360: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
9370: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
9380: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
9390: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
93a0: 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e  must be in accen
93b0: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
93c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
93d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
93e0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
93f0: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
9400: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
9410: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
9420: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 6e  ->nFree = (u16)n
9430: 46 72 65 65 3b 0a 20 20 20 20 69 66 28 20 6e 46  Free;.    if( nF
9440: 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  ree>=usableSize 
9450: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
9460: 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78   space cannot ex
9470: 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20  ceed total page 
9480: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  size */.      re
9490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
94a0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
94b0: 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65  ..#if 0.  /* Che
94c0: 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20  ck that all the 
94d0: 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63  offsets in the c
94e0: 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79  ell offset array
94f0: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
9500: 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  e. .  ** .  ** O
9510: 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e  mitting this con
9520: 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61  sistency check a
9530: 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70 50 61  nd using the pPa
9540: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73  ge->maskPage mas
9550: 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  k.  ** to preven
9560: 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68  t overrunning th
9570: 65 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e  e page buffer in
9580: 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75   findCell() resu
9590: 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e  lts in a.  ** 2.
95a0: 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67  5% performance g
95b0: 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ain..  */.  {.  
95c0: 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20    u8 *pOff;     
95d0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
95e0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c  sed to check all
95f0: 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72   cell offsets ar
9600: 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  e in range */.  
9610: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
9620: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
9630: 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66   end of cell off
9640: 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  set array */.   
9650: 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20   u8 mask;       
9660: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
9670: 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a  s that must be z
9680: 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65  ero in MSB of ce
9690: 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20  ll offsets */.  
96a0: 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29    mask = ~(((u8)
96b0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
96c0: 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64  8))-1);.    pEnd
96d0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
96e0: 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65  set + pPage->nCe
96f0: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70  ll*2];.    for(p
9700: 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  Off=&data[cellOf
9710: 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e  fset]; pOff!=pEn
9720: 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d  d && !((*pOff)&m
9730: 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a  ask); pOff+=2);.
9740: 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45      if( pOff!=pE
9750: 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  nd ){.      retu
9760: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9770: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
9780: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 50  }.#endif..    pP
9790: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
97a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
97b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
97c0: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
97d0: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
97e0: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
97f0: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
9800: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
9810: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9820: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
9830: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
9840: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
9850: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
9860: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
9870: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
9880: 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
9890: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
98a0: 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
98b0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
98c0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
98d0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
98e0: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
98f0: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
9900: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
9910: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
9920: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
9930: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
9940: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
9950: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
9960: 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
9970: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9980: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9990: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
99a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
99b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
99c0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
99d0: 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74  .  /*memset(&dat
99e0: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
99f0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
9a00: 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d  );*/.  data[hdr]
9a10: 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a   = (char)flags;.
9a20: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
9a30: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
9a40: 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29  F_LEAF)==0 ?1:0)
9a50: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
9a60: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
9a70: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
9a80: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
9a90: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
9aa0: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
9ab0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
9ac0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
9ad0: 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65   first;.  decode
9ae0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
9af0: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
9b00: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
9b10: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9b20: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
9b30: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
9b40: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
9b50: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
9b60: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
9b70: 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50  e<=32768 );.  pP
9b80: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
9b90: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
9ba0: 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  1;.  pPage->nCel
9bb0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
9bc0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
9bd0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
9be0: 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
9bf0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
9c00: 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
9c10: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
9c20: 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
9c30: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
9c40: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
9c50: 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
9c60: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
9c70: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
9c80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
9c90: 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
9ca0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
9cb0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
9cc0: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
9cd0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
9ce0: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
9cf0: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
9d00: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
9d10: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
9d20: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
9d30: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9d40: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
9d50: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72  1 ? 100 : 0;.  r
9d60: 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
9d70: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
9d80: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
9d90: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
9da0: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
9db0: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
9dc0: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
9dd0: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
9de0: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
9df0: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
9e00: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
9e10: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
9e20: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
9e30: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
9e40: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
9e50: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
9e60: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
9e70: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
9e80: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
9e90: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
9ea0: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
9eb0: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
9ec0: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
9ed0: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
9ee0: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
9ef0: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
9f00: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
9f10: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
9f20: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
9f30: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
9f40: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
9f50: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9f60: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20  3BtreeGetPage(. 
9f70: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
9f80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
9f90: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
9fa0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
9fb0: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
9fc0: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
9fd0: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
9fe0: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
9ff0: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
a000: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
a010: 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
a020: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c       /* Do not l
a030: 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
a040: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
a050: 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
a060: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
a070: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a080: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
a090: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
a0a0: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
a0b0: 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
a0c0: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
a0d0: 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e  )&pDbPage, noCon
a0e0: 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  tent);.  if( rc 
a0f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
a100: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
a110: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
a120: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
a130: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a140: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
a150: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
a160: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
a170: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
a180: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
a190: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
a1a0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
a1b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
a1c0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
a1d0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
a1e0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
a1f0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
a200: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
a210: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
a220: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
a230: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
a240: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
a250: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a260: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a270: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a280: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
a290: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
a2a0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
a2b0: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
a2c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
a2d0: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
a2e0: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
a2f0: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
a300: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
a310: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
a320: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
a330: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
a340: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
a350: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
a360: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
a370: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
a380: 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50  atic Pgno pagerP
a390: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
a3a0: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e  d *pBt){.  int n
a3b0: 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  Page = -1;.  int
a3c0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
a3d0: 42 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20  Bt->pPage1 );.  
a3e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a3f0: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
a400: 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
a410: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
a420: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67  QLITE_OK || nPag
a430: 65 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72  e==-1 );.  retur
a440: 6e 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d  n (Pgno)nPage;.}
a450: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
a460: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
a470: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
a480: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
a490: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
a4a0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
a4b0: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
a4c0: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
a4d0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
a4e0: 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  age() and sqlite
a4f0: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
a500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a510: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
a520: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
a530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a540: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
a550: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
a560: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a570: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
a580: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
a590: 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  ge **ppPage     
a5a0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
a5b0: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
a5c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
a5d0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
a5e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
a5f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a600: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a610: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
a620: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a630: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
a640: 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
a650: 6f 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74  often the case t
a660: 68 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20  hat the page we 
a670: 77 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20  want is already 
a680: 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49  in cache..  ** I
a690: 66 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72  f so, get it dir
a6a0: 65 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76  ectly.  This sav
a6b0: 65 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e  es us from havin
a6c0: 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70  g to call.  ** p
a6d0: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
a6e0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e  to make sure pgn
a6f0: 6f 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69  o is within limi
a700: 74 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74  ts, which result
a710: 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73  s.  ** in a meas
a720: 75 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61  ureable performa
a730: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73  nce improvements
a740: 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ..  */.  *ppPage
a750: 20 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65   = pPage = btree
a760: 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
a770: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
a780: 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67  ge ){.    /* Pag
a790: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
a7a0: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20  cache */.    rc 
a7b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
a7c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67  else{.    /* Pag
a7d0: 65 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  e not in cache. 
a7e0: 20 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a   Acquire it. */.
a7f0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67      if( pgno>pag
a800: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
a810: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a820: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a830: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
a840: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
a850: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
a860: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
a870: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
a880: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
a890: 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  ge = *ppPage;.  
a8a0: 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
a8b0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  isInit ){.    rc
a8c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
a8d0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
a8e0: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
a8f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
a900: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
a910: 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  );.    *ppPage =
a920: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a930: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
a940: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
a950: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
a960: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
a970: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
a980: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
a990: 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
a9a0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
a9b0: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
a9c0: 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
a9d0: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
a9e0: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
a9f0: 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  low==0 || sqlite
aa00: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
aa10: 6e 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  nt(pPage->pDbPag
aa20: 65 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65  e)>1 );.    asse
aa30: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
aa40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
aa50: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
aa60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
aa70: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
aa80: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
aa90: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
aaa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
aab0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
aac0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
aad0: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
aae0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
aaf0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ab00: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
ab10: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
ab20: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
ab30: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
ab40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
ab50: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
ab60: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
ab70: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
ab80: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
ab90: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
aba0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
abb0: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
abc0: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
abd0: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
abe0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
abf0: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
ac00: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
ac10: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
ac20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
ac30: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
ac40: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
ac50: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
ac60: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
ac70: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
ac80: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
ac90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
aca0: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
acb0: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
acc0: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
acd0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
ace0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
acf0: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
ad00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ad10: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
ad20: 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
ad30: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
ad40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
ad50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ad60: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
ad70: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
ad80: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
ad90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
ada0: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
adb0: 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
adc0: 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
add0: 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
ade0: 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
adf0: 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
ae00: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
ae10: 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
ae20: 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
ae30: 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
ae40: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
ae50: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
ae60: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
ae70: 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
ae80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ae90: 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
aea0: 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
aeb0: 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
aec0: 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
aed0: 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
aee0: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
aef0: 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
af00: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
af10: 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
af20: 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
af30: 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
af40: 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
af50: 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
af60: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  g. */.      sqli
af70: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
af80: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
af90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
afa0: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
afb0: 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
afc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
afd0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
afe0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
aff0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
b000: 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
b010: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
b020: 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
b030: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b040: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
b050: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
b060: 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
b070: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
b080: 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
b090: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
b0a0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
b0b0: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
b0c0: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
b0d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
b0e0: 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
b0f0: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
b100: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77  a new database w
b110: 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d  ith a random nam
b120: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
b130: 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d  his randomly nam
b140: 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  ed.** database f
b150: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
b160: 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33  ted when sqlite3
b170: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
b180: 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46  called..** If zF
b190: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
b1a0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
b1b0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
b1c0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
b1d0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
b1e0: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
b1f0: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
b200: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
b210: 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
b220: 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
b230: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
b240: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
b250: 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
b260: 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
b270: 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
b280: 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
b290: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b2a0: 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
b2b0: 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
b2c0: 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
b2d0: 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
b2e0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
b2f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
b300: 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
b310: 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
b320: 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
b330: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b340: 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  treeOpen(.  cons
b350: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
b360: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
b370: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
b380: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
b390: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
b3a0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
b3b0: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
b3c0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
b3d0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
b3e0: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
b3f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
b400: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
b410: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
b420: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
b430: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
b440: 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
b450: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
b460: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
b470: 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
b480: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
b490: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
b4a0: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
b4b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
b4c0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
b4d0: 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61  btree */.  BtSha
b4e0: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
b4f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
b500: 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
b510: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
b520: 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
b550: 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
b560: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
b570: 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
b580: 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
b590: 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
b5a0: 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
b5b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
b5c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
b5d0: 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
b5e0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
b5f0: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b610: 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
b620: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
b630: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
b640: 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
b650: 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
b660: 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
b670: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   */..  /* Set th
b680: 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
b690: 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
b6a0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
b6b0: 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
b6c0: 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
b6d0: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20  based database. 
b6e0: 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f  This symbol is o
b6f0: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a  nly required if.
b700: 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74    ** either of t
b710: 68 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f  he shared-data o
b720: 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61  r autovacuum fea
b730: 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c  tures are compil
b740: 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  ed .  ** into th
b750: 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a  e library..  */.
b760: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
b770: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
b780: 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e  CACHE) || !defin
b790: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
b7a0: 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66  UTOVACUUM).  #if
b7b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b7c0: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e  MEMORYDB.    con
b7d0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
b7e0: 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20   0;.  #else.    
b7f0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
b800: 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  b = zFilename &&
b810: 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61   !strcmp(zFilena
b820: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b  me, ":memory:");
b830: 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  .  #endif.#endif
b840: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
b850: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
b860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b870: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
b880: 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  .  pVfs = db->pV
b890: 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  fs;.  p = sqlite
b8a0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
b8b0: 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
b8c0: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
b8d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b8e0: 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
b8f0: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
b900: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23    p->db = db;..#
b910: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b920: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
b930: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
b940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
b950: 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
b960: 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
b970: 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
b980: 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
b990: 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
b9a0: 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
b9b0: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
b9c0: 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
b9d0: 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
b9e0: 4d 65 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c  Memdb==0 && zFil
b9f0: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
ba00: 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28  me[0] ){.    if(
ba10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
ba20: 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
ba30: 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20  Enabled ){.     
ba40: 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
ba50: 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
ba60: 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
ba70: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
ba80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
ba90: 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  oc(nFullPathname
baa0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bab0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
bac0: 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  red;.      p->sh
bad0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
bae0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
baf0: 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63 68  QLITE_SharedCach
bb00: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  e;.      if( !zF
bb10: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
bb20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
bb30: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
bb40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bb50: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
bb60: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c     sqlite3OsFull
bb70: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
bb80: 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50  Filename, nFullP
bb90: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
bba0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d  thname);.      m
bbb0: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
bbc0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
bbd0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
bbe0: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
bbf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
bc00: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
bc10: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
bc20: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
bc30: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
bc40: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
bc50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
bc60: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
bc70: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
bc80: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
bc90: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
bca0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
bcb0: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
bcc0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
bcd0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
bce0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
bcf0: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
bd00: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
bd10: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
bd20: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20  pBt->pPager)).  
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
bd40: 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
bd50: 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
bd60: 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
bd70: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
bd80: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
bd90: 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
bda0: 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
bdb0: 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
bdc0: 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
bdd0: 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
bde0: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
bdf0: 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
be00: 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
be10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
be20: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
be30: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
be40: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
be50: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
be60: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
be70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
be80: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
be90: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
bea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
beb0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
bec0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bed0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
bee0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
bef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
bf00: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
bf10: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
bf20: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
bf30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
bf40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
bf50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
bf60: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
bf70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
bf80: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
bf90: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
bfa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
bfb0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
bfc0: 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
bfd0: 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
bfe0: 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
bff0: 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
c000: 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
c010: 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
c020: 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
c030: 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
c040: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
c050: 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
c060: 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
c070: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c080: 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
c090: 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
c0a0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
c0b0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
c0c0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
c0d0: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
c0e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
c0f0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
c100: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
c110: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
c120: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
c130: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
c140: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
c150: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
c160: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
c170: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
c180: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
c190: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
c1a0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
c1b0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
c1c0: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
c1d0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
c1e0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
c1f0: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
c200: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
c210: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
c220: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
c230: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
c240: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
c250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
c260: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
c270: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
c280: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
c290: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
c2a0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
c2b0: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
c2c0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
c2d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c2e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
c2f0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
c300: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
c310: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
c320: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
c330: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
c340: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
c360: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
c370: 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  vfsFlags);.    i
c380: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c390: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
c3a0: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
c3b0: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
c3c0: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
c3d0: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
c3e0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
c3f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c400: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
c410: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
c420: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20    }.    pBt->db 
c430: 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
c440: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
c450: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
c460: 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
c470: 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
c480: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
c490: 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  ;.  .    sqlite3
c4a0: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
c4b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
c4c0: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70  geReinit);.    p
c4d0: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
c4e0: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
c4f0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72   = 0;.    pBt->r
c500: 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65  eadOnly = sqlite
c510: 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
c520: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
c530: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
c540: 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62   = get2byte(&zDb
c550: 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20  Header[16]);.   
c560: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
c570: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
c580: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
c590: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
c5a0: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
c5b0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
c5c0: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
c5d0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
c5e0: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
c5f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c600: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
c610: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
c620: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
c630: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
c640: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
c650: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
c660: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
c670: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
c680: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
c690: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
c6a0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
c6b0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
c6c0: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
c6d0: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
c6e0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
c6f0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
c700: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
c710: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
c720: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
c730: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
c740: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
c750: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
c760: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
c770: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
c780: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
c790: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
c7a0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
c7b0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
c7c0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
c7d0: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
c7e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
c7f0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
c800: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
c810: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
c820: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
c830: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
c840: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
c850: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
c860: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
c870: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  0];.      pBt->p
c880: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
c890: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
c8a0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
c8b0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
c8c0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
c8d0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
c8e0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
c8f0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
c900: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
c910: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
c920: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
c930: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
c940: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
c950: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
c960: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
c970: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
c980: 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
c990: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
c9a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
c9b0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
c9c0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
c9d0: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
c9e0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
c9f0: 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
ca00: 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
ca10: 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
ca20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ca30: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
ca40: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ca50: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
ca60: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
ca70: 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
ca80: 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
ca90: 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
caa0: 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
cab0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
cac0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  able ){.      sq
cad0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
cae0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
caf0: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
cb00: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
cb10: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
cb20: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
cb30: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
cb40: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
cb50: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
cb60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
cb70: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
cb80: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
cb90: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
cba0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
cbb0: 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
cbc0: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
cbd0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
cbe0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
cbf0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
cc00: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
cc10: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
cc20: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
cc30: 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
cc40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
cc50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
cc60: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
cc70: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
cc80: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
cc90: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
cca0: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
ccb0: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
ccc0: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
ccd0: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
cce0: 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
ccf0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
cd00: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
cd10: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
cd20: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
cd30: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
cd40: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
cd50: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
cd60: 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
cd70: 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
cd80: 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
cd90: 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
cda0: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
cdb0: 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
cdc0: 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
cdd0: 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
cde0: 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
cdf0: 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
ce00: 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
ce10: 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
ce20: 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
ce30: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
ce40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ce50: 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
ce60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
ce70: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ce80: 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
ce90: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
cea0: 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
ceb0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
cec0: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
ced0: 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
cee0: 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
cef0: 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
cf00: 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
cf10: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
cf20: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
cf30: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
cf40: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
cf50: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
cf60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cf70: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
cf80: 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
cf90: 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
cfa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
cfb0: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
cfc0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
cfd0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
cfe0: 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
cff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
d000: 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
d010: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
d020: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
d030: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
d040: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
d050: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
d060: 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
d070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d090: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
d0a0: 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
d0b0: 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
d0c0: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
d0d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
d0e0: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
d0f0: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
d100: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
d110: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
d120: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
d130: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
d140: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
d150: 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
d160: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
d170: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
d180: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d190: 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
d1a0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
d1b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
d1c0: 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
d1d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d1e0: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
d1f0: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
d200: 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
d210: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
d220: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
d230: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
d240: 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
d250: 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
d260: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
d270: 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
d280: 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
d290: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
d2a0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
d2b0: 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
d2c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
d2d0: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
d2e0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
d2f0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
d300: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
d310: 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  HE.  sqlite3_mut
d320: 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42  ex *pMaster;.  B
d330: 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
d340: 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
d350: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
d360: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
d370: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
d380: 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73  );.  pMaster = s
d390: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
d3a0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
d3b0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
d3c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d3d0: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
d3e0: 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
d3f0: 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
d400: 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
d410: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
d420: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
d430: 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
d440: 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
d450: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
d460: 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
d470: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
d480: 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
d490: 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
d4a0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
d4b0: 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
d4c0: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
d4d0: 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
d4e0: 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
d4f0: 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
d500: 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
d510: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
d520: 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
d530: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
d540: 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
d550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d560: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
d570: 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
d580: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d590: 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
d5a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
d5b0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
d5c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d5d0: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
d5e0: 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
d5f0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
d600: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
d610: 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
d620: 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
d630: 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
d640: 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
d650: 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
d660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d670: 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
d680: 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
d690: 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
d6a0: 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
d6b0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
d6c0: 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
d6d0: 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
d6e0: 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e );.  }.}../*.*
d6f0: 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
d700: 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
d710: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
d720: 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
d730: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
d740: 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  {.  sqlite3PageF
d750: 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70  ree( pBt->pTmpSp
d760: 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d  ace);.  pBt->pTm
d770: 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  pSpace = 0;.}../
d780: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
d790: 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
d7a0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
d7b0: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
d7c0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
d7d0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
d7e0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
d7f0: 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
d800: 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
d810: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
d820: 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
d830: 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
d840: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d850: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
d860: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
d870: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
d880: 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
d890: 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
d8a0: 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
d8b0: 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
d8c0: 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
d8d0: 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
d8e0: 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
d8f0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
d900: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
d910: 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
d920: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
d930: 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
d940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
d950: 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
d960: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
d970: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
d980: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
d990: 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
d9a0: 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
d9b0: 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
d9c0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
d9d0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
d9e0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
d9f0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
da00: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
da10: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
da20: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
da30: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
da40: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
da50: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
da60: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
da70: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
da80: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
da90: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
daa0: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
dab0: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
dac0: 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
dad0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
dae0: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
daf0: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
db00: 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
db10: 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
db20: 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
db30: 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
db40: 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
db50: 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
db60: 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
db70: 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
db80: 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
db90: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
dba0: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
dbb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
dbc0: 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
dbd0: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
dbe0: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
dbf0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
dc00: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
dc10: 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
dc20: 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
dc30: 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
dc40: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
dc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
dc60: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
dc70: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
dc80: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
dc90: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
dca0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
dcb0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
dcc0: 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
dcd0: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
dce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
dcf0: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
dd00: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
dd10: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
dd20: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
dd30: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
dd40: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
dd50: 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
dd60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
dd70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dd80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dd90: 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
dda0: 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
ddb0: 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
ddc0: 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
ddd0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
dde0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
ddf0: 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
de00: 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
de10: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
de20: 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
de30: 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
de40: 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
de50: 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
de60: 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
de70: 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
de80: 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
de90: 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
dea0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
deb0: 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
dec0: 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
ded0: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
dee0: 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
def0: 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
df00: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
df10: 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
df20: 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
df30: 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
df40: 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
df50: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
df60: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
df70: 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
df80: 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
df90: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
dfa0: 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
dfb0: 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
dfc0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
dfd0: 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
dfe0: 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
dff0: 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
e000: 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
e010: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
e020: 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
e030: 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
e040: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
e050: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
e060: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
e070: 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
e080: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
e090: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e0a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e0b0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
e0c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
e0d0: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
e0e0: 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
e0f0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
e100: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
e110: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
e120: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e130: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
e140: 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
e150: 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
e160: 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
e170: 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
e180: 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
e190: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
e1a0: 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
e1b0: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
e1c0: 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
e1d0: 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
e1e0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
e1f0: 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
e200: 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
e210: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
e220: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
e230: 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
e240: 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
e250: 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
e260: 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
e270: 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
e280: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
e290: 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
e2a0: 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
e2b0: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
e2c0: 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
e2d0: 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
e2e0: 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
e2f0: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
e300: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
e310: 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
e320: 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74  te3BtreeSetSafet
e330: 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c  yLevel(Btree *p,
e340: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
e350: 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53  fullSync){.  BtS
e360: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e370: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
e380: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e390: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
e3a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
e3b0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
e3c0: 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
e3d0: 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61  tyLevel(pBt->pPa
e3e0: 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c  ger, level, full
e3f0: 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
e400: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
e410: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e420: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
e430: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
e440: 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
e450: 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
e460: 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
e470: 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
e480: 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
e490: 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
e4a0: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
e4b0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
e4c0: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
e4d0: 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
e4e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
e4f0: 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
e500: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e510: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e520: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
e530: 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
e540: 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
e550: 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
e560: 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
e570: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
e580: 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
e590: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
e5a0: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
e5b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64  rn rc;.}..#if !d
e5c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e5d0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
e5e0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
e5f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
e600: 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  )./*.** Change t
e610: 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
e620: 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
e630: 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
e640: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
e650: 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
e660: 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
e670: 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
e680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
e690: 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
e6a0: 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
e6b0: 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
e6c0: 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
e6d0: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
e6e0: 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
e6f0: 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
e700: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
e710: 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
e720: 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
e730: 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
e740: 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
e750: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
e760: 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
e770: 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
e780: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
e790: 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
e7a0: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
e7b0: 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
e7c0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
e7d0: 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
e7e0: 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
e7f0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
e800: 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
e810: 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
e820: 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
e830: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e840: 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
e850: 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
e860: 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
e870: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
e880: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
e890: 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
e8a0: 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
e8b0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
e8c0: 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
e8d0: 68 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65  hen the pageSize
e8e0: 46 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65  Fixed flag is se
e8f0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
e900: 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
e910: 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
e920: 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
e930: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
e940: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
e950: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
e960: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
e970: 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
e980: 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
e990: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e9a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
e9b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
e9c0: 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
e9d0: 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
e9e0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
e9f0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
ea00: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
ea10: 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  ixed ){.    sqli
ea20: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
ea30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ea40: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
ea50: 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
ea60: 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
ea70: 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
ea80: 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
ea90: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
eaa0: 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
eab0: 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
eac0: 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
ead0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
eae0: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
eaf0: 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
eb00: 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
eb10: 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
eb20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
eb30: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
eb40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
eb50: 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20  !pBt->pPage1 && 
eb60: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
eb70: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
eb80: 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
eb90: 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
eba0: 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
ebb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ebc0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
ebd0: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
ebe0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  pageSize);.  }. 
ebf0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
ec00: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
ec10: 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
ec20: 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
ec30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
ec40: 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  d = 1;.  sqlite3
ec50: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
ec60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ec70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
ec80: 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
ec90: 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
eca0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
ecb0: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
ecc0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
ecd0: 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
ece0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ecf0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ed00: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
ed10: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
ed20: 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
ed30: 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
ed40: 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
ed50: 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
ed60: 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
ed70: 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
ed80: 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
ed90: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
eda0: 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
edb0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
edc0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
edd0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
ede0: 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
edf0: 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
ee00: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
ee10: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
ee20: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
ee30: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
ee40: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
ee50: 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
ee60: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
ee70: 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
ee80: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
ee90: 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
eea0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
eeb0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
eec0: 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
eed0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
eee0: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
eef0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ef00: 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
ef10: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
ef20: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
ef30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ef40: 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
ef50: 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
ef60: 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
ef70: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
ef80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
ef90: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
efa0: 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
efb0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
efc0: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
efd0: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
efe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
eff0: 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
f000: 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
f010: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
f020: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
f030: 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
f040: 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
f050: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
f060: 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
f070: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
f080: 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
f090: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
f0a0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
f0b0: 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
f0c0: 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
f0d0: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
f0e0: 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
f0f0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
f100: 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
f110: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
f120: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
f130: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
f140: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
f150: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f170: 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
f180: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
f190: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
f1a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f1b0: 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
f1c0: 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
f1d0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
f1e0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
f1f0: 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28  geSizeFixed && (
f200: 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
f210: 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
f220: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
f230: 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
f240: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
f250: 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
f260: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
f270: 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
f280: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
f290: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
f2a0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
f2b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f2c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
f2d0: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
f2e0: 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
f2f0: 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
f300: 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
f310: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
f320: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
f330: 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
f340: 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
f350: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
f360: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f370: 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
f380: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
f390: 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
f3a0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
f3b0: 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
f3c0: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
f3d0: 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
f3e0: 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
f3f0: 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
f400: 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
f410: 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
f420: 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
f430: 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
f440: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
f450: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
f460: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
f470: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
f480: 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
f490: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
f4a0: 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
f4b0: 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
f4c0: 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
f4d0: 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
f4e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
f4f0: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
f500: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
f510: 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
f520: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
f530: 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
f540: 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
f550: 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
f560: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
f570: 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
f580: 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
f590: 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
f5a0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
f5b0: 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
f5c0: 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
f5d0: 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
f5e0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
f5f0: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
f600: 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e  *pPage1;.  int n
f610: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
f620: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f630: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
f640: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
f650: 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
f660: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
f670: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
f680: 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
f690: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f6a0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
f6b0: 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
f6c0: 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
f6d0: 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
f6e0: 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
f6f0: 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
f700: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
f710: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
f720: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
f730: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
f740: 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
f750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f760: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
f770: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c  it_failed;.  }el
f780: 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  se if( nPage>0 )
f790: 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69  {.    int pageSi
f7a0: 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62  ze;.    int usab
f7b0: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
f7c0: 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
f7d0: 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
f7e0: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
f7f0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
f800: 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
f810: 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
f820: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
f830: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
f840: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
f850: 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
f860: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
f870: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f880: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
f890: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
f8a0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
f8b0: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  }..    /* The ma
f8c0: 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66  ximum embedded f
f8d0: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
f8e0: 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e  exactly 25%.  An
f8f0: 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20  d the minimum.  
f900: 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72    ** embedded fr
f910: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31  action must be 1
f920: 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65  2.5% for both le
f930: 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d  af-data and non-
f940: 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a  leaf-data..    *
f950: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
f960: 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
f970: 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
f980: 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
f990: 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
f9a0: 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
f9b0: 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
f9c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f9d0: 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
f9e0: 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
f9f0: 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
fa00: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
fa10: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
fa20: 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
fa30: 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
fa40: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
fa50: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
fa60: 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
fa70: 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20  ize<512 ||.     
fa80: 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50     (SQLITE_MAX_P
fa90: 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26  AGE_SIZE<32768 &
faa0: 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  & pageSize>SQLIT
fab0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
fac0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
fad0: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
fae0: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
faf0: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
fb00: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
fb10: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
fb20: 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
fb30: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  0];.    if( page
fb40: 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
fb50: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
fb60: 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
fb70: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
fb80: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
fb90: 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
fba0: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
fbb0: 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
fbc0: 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
fbd0: 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
fbe0: 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
fbf0: 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
fc00: 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
fc10: 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
fc20: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
fc30: 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
fc40: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
fc50: 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
fc60: 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
fc70: 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
fc80: 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
fc90: 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
fca0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fcb0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
fcc0: 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
fcd0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
fce0: 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  16)usableSize;. 
fcf0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
fd00: 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
fd10: 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
fd20: 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
fd30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fd40: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
fd50: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
fd60: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
fd70: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
fd80: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
fd90: 69 6c 65 64 3b 0a 20 20 20 20 20 20 72 65 74 75  iled;.      retu
fda0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fdb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
fdc0: 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20  leSize<500 ){.  
fdd0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
fde0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
fdf0: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
fe00: 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
fe10: 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
fe20: 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
fe30: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
fe40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fe50: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
fe60: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
fe70: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
fe80: 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
fe90: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
fea0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
feb0: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
fec0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
fed0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
fee0: 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
fef0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
ff00: 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
ff10: 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
ff20: 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
ff30: 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
ff40: 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
ff50: 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
ff60: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
ff70: 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
ff80: 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
ff90: 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
ffa0: 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
ffb0: 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
ffc0: 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
ffd0: 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
ffe0: 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
fff0: 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
10000 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
10010 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
10020 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
10030 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
10040 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
10050 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
10060 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
10070 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
10080 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
10090 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72   a 2-byte poiner
100a0 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
100b0 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
100c0 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
100d0 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
100e0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
100f0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
10100 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
10110 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
10120 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
10130 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
10140 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
10150 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
10160 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
10170 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
10180 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  2/255 - 23;.  pB
10190 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74  t->maxLeaf = pBt
101a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
101b0 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  5;.  pBt->minLea
101c0 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  f = (pBt->usable
101d0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
101e0 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20  - 23;.  assert( 
101f0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
10200 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
10210 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
10220 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
10230 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10240 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
10250 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
10260 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
10270 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
10280 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
10290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
102a0 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
102b0 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78  e lockBtree() ex
102c0 63 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73  cept that it als
102d0 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a  o invokes the.**
102e0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
102f0 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20  f there is lock 
10300 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73  contention..*/.s
10310 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
10320 72 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72  reeWithRetry(Btr
10330 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74  ee *pRef){.  int
10340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10350 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10360 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
10370 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66  ex(pRef) );.  if
10380 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d  ( pRef->inTrans=
10390 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
103a0 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74     u8 inTransact
103b0 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d  ion = pRef->pBt-
103c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  >inTransaction;.
103d0 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
103e0 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63  ty(pRef);.    rc
103f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
10400 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20  eginTrans(pRef, 
10410 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42  0);.    pRef->pB
10420 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
10430 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e   = inTransaction
10440 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72  ;.    pRef->inTr
10450 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
10460 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10480 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61   pRef->pBt->nTra
10490 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
104a0 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  }.    btreeInteg
104b0 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a  rity(pRef);.  }.
104c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20    return rc;.}. 
104d0 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66        ../*.** If
104e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
104f0 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
10500 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
10510 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
10520 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
10530 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
10540 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
10550 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
10560 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
10570 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
10580 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
10590 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
105a0 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
105b0 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
105c0 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
105d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
105e0 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e   are any outstan
105f0 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68  ding cursors, th
10600 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10610 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
10620 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
10630 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
10640 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
10650 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10660 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
10670 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
10680 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10690 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
106a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
106b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
106c0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
106d0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
106e0 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72   && pBt->pCursor
106f0 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ==0 && pBt->pPag
10700 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  e1!=0 ){.    if(
10710 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
10720 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
10730 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61  r)>=1 ){.      a
10740 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
10750 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
10760 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10770 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt->pPage1);.   
10780 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67   }.    pBt->pPag
10790 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
107a0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
107b0 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  w database by in
107c0 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
107d0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
107e0 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  .** file..*/.sta
107f0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
10800 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
10810 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
10820 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
10830 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
10840 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
10850 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10860 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10870 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10890 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
108a0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
108b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
108c0 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30  TE_OK || nPage>0
108d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
108e0 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  c;.  }.  pP1 = p
108f0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
10900 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
10910 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
10920 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
10930 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
10940 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
10950 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
10960 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
10970 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
10980 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
10990 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
109a0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
109b0 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
109c0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
109d0 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
109e0 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
109f0 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
10a00 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
10a10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
10a20 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
10a30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
10a40 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
10a50 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
10a60 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
10a70 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
10a80 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
10a90 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
10aa0 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
10ab0 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
10ac0 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
10ad0 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
10ae0 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
10af0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
10b00 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
10b10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
10b20 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
10b30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10b40 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
10b50 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
10b60 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
10b70 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
10b80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
10b90 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
10ba0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
10bb0 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
10bc0 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
10bd0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
10be0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
10bf0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
10c00 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
10c10 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
10c20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10c30 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
10c40 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
10c50 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
10c60 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
10c70 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
10c80 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10c90 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
10ca0 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
10cb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
10cc0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
10cd0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
10ce0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
10cf0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
10d00 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
10d10 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
10d20 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
10d30 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
10d40 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
10d50 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
10d60 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
10d70 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
10d80 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
10d90 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
10da0 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
10db0 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
10dc0 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
10dd0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
10de0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
10df0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
10e00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
10e10 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
10e20 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
10e30 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
10e40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10e50 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
10e60 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
10e70 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
10e80 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
10e90 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
10ea0 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
10eb0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
10ec0 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
10ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
10ee0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
10ef0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
10f00 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
10f10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10f20 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
10f30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10f40 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
10f50 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
10f60 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
10f70 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
10f80 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
10f90 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
10fa0 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
10fb0 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
10fc0 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
10fd0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
10fe0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
10ff0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
11000 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
11010 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
11020 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
11030 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
11040 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
11050 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
11060 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
11070 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
11080 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
11090 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
110a0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
110b0 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
110c0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
110d0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
110e0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
110f0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
11100 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
11110 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
11120 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
11130 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
11140 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
11150 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
11160 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
11170 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
11180 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
11190 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
111a0 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
111b0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
111c0 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
111d0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
111e0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
111f0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
11200 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
11210 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
11220 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
11230 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
11240 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
11250 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
11260 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
11270 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
11280 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
11290 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
112a0 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
112b0 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
112c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
112d0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
112e0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
112f0 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
11300 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
11310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11320 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
11330 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
11340 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11350 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
11360 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
11370 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
11380 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
11390 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
113a0 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
113b0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
113c0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
113d0 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
113e0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
113f0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
11400 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
11410 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
11420 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
11430 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
11440 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
11450 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
11460 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
11470 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
11480 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
11490 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
114a0 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
114b0 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
114c0 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
114d0 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
114e0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
114f0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
11500 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
11510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11520 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
11530 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
11540 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
11550 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
11560 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
11570 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
11580 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
11590 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
115a0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
115b0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
115c0 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
115d0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
115e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
115f0 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
11600 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11610 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
11620 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20  isPending ){.   
11630 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
11640 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
11650 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
11660 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
11670 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
11680 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
11690 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
116a0 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
116b0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
116c0 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
116d0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
116e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
116f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11710 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
11720 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
11730 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
11740 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
11750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
11760 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
11770 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
11780 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
11790 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  f..  do {.    /*
117a0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
117b0 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
117c0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
117d0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
117e0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
117f0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
11800 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
11810 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
11820 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
11830 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
11840 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
11850 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
11860 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
11870 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
11880 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
11890 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
118a0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
118b0 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
118c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
118d0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
118e0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
118f0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
11900 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
11910 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
11920 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
11930 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
11940 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
11950 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
11960 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
11970 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
11980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11990 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
119a0 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
119b0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
119c0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
119d0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
119e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
119f0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
11a00 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
11a10 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
11a20 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
11a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11a40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11a50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
11a60 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
11a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11a80 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
11a90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11aa0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
11ab0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
11ac0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
11ad0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
11ae0 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
11af0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11b00 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
11b10 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
11b20 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
11b30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
11b40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
11b50 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11b60 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
11b70 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
11b80 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ion++;.    }.   
11b90 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
11ba0 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
11bb0 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
11bc0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
11bd0 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
11be0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
11bf0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11c00 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
11c10 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
11c20 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
11c30 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72  CACHE.    if( wr
11c40 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73  flag ){.      as
11c50 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
11c60 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
11c70 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
11c80 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c       pBt->isExcl
11c90 75 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66  usive = (u8)(wrf
11ca0 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65  lag>1);.    }.#e
11cb0 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73  ndif.  }...trans
11cc0 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
11cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
11ce0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
11cf0 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
11d00 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
11d10 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
11d20 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
11d30 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
11d40 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
11d50 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
11d60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
11d70 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
11d80 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
11d90 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
11da0 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
11db0 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
11dc0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11dd0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
11de0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
11df0 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
11e00 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
11e10 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
11e20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11e30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11e40 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
11e50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11e60 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
11e70 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
11e80 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
11e90 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
11ea0 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
11eb0 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
11ec0 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
11ed0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
11ee0 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
11ef0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
11f00 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
11f10 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
11f20 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
11f30 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
11f40 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
11f50 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
11f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f80 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
11f90 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
11fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11fc0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
11fd0 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
11fe0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
12010 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
12020 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
12030 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
12040 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
12050 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
12060 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
12070 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12080 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
12090 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
120a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
120b0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
120c0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
120d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
120e0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
120f0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
12100 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
12110 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
12120 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
12130 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
12140 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
12150 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
12160 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
12170 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
12180 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12190 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
121a0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
121b0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
121c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
121d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
121e0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
121f0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
12200 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
12210 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
12220 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
12230 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
12240 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12250 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
12260 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
12270 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
12280 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
12290 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
122a0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
122b0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
122c0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
122d0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
122e0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
122f0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
12300 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
12310 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
12320 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  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 72 65 74 75  InitOrig;.  retu
12350 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12360 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
12370 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
12380 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
12390 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
123a0 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
123b0 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
123c0 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
123d0 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
123e0 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
123f0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
12400 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
12410 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
12420 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
12430 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
12440 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
12450 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
12460 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
12470 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
12480 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
12490 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
124c0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
124d0 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
124e0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
124f0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
12500 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
12510 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
12520 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
12530 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
12540 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
12550 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
12560 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
12570 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
12580 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
12590 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
125a0 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
125c0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
125d0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
125e0 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
125f0 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
12600 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
12610 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
12620 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
12630 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12640 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12650 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
12660 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12670 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
12680 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
12690 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
126a0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
126b0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
126c0 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
126d0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
126e0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
126f0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
12700 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
12710 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
12720 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
12730 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12740 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12750 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
12760 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
12770 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
12780 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
12790 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
127a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
127b0 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69  nCell;..    sqli
127c0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
127d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
127e0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
127f0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
12800 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
12810 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
12820 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
12830 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
12840 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
12850 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
12860 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
12870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12880 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
12890 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
128a0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
128b0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
128c0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
128d0 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
128e0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
128f0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
12900 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
12910 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
12920 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
12930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
12940 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12950 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12970 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
12980 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
12990 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
129a0 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
129b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
129c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
129d0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
129e0 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
129f0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
12a00 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
12a10 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
12a20 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
12a30 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
12a40 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
12a50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12a60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
12a70 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
12a80 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
12a90 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
12aa0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
12ab0 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
12ac0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12ad0 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
12ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12af0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
12b00 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
12b10 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
12b20 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
12b30 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
12b40 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
12b50 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
12b60 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
12b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12b80 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
12b90 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
12ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
12bb0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
12bc0 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
12bd0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
12be0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
12bf0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
12c00 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
12c10 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
12c20 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
12c30 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
12c40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12c50 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
12c60 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
12c70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
12c80 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
12c90 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
12ca0 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
12cb0 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
12cc0 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50  Commit.){.  MemP
12cd0 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
12ce0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
12cf0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
12d00 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
12d10 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
12d20 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
12d30 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
12d40 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
12d50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
12d60 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
12d70 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
12d80 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
12d90 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
12da0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
12db0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
12dc0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
12dd0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
12de0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12df0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
12e00 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
12e10 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
12e20 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
12e30 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
12e40 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
12e50 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
12e60 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
12e70 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
12e80 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
12e90 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
12ea0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
12eb0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
12ec0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
12ed0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
12ee0 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
12ef0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
12f00 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
12f10 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
12f20 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
12f30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12f40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
12f50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
12f60 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
12f70 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
12f80 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
12f90 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
12fa0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
12fb0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
12fc0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
12fd0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
12fe0 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
12ff0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
13000 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
13010 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
13020 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
13030 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
13040 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
13050 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
13060 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
13070 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
13080 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
13090 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
130a0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
130b0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
130c0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
130d0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
130e0 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
130f0 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
13100 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
13110 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
13120 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
13130 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
13140 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
13150 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
13160 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
13170 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13180 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13190 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
131a0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
131b0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
131c0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
131d0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
131e0 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
131f0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
13200 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
13210 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
13220 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
13230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
13250 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
13260 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13270 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
13280 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
13290 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
132a0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
132b0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
132c0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
132d0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
132e0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
132f0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
13300 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
13310 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
13320 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
13330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13340 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
13350 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
13360 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
13370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13380 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13390 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
133a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
133b0 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
133c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
133d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
133e0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
133f0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
13400 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13410 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
13420 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
13430 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
13440 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
13450 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
13460 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
13470 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13490 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
134a0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
134b0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
134c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
134d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
134e0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
134f0 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
13500 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
13510 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
13520 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
13530 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
13540 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
13550 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
13560 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
13570 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
13580 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
13590 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
135a0 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
135b0 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
135c0 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
135d0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
135e0 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
135f0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
13600 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
13610 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
13620 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
13630 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
13640 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
13650 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
13660 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
13670 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
13680 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
13690 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
136a0 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
136b0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
136c0 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
136d0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
136e0 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  o, the implement
136f0 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a  ation assumes.**
13700 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
13710 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
13720 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
13730 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20  p() until.** it 
13740 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
13750 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c  ONE or an error,
13760 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69   and that nFin i
13770 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
13780 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74  of pages the dat
13790 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
137a0 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68  contain after th
137b0 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  is .** process i
137c0 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73  s complete..*/.s
137d0 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
137e0 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
137f0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
13800 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
13810 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
13820 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
13830 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13840 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
13850 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
13860 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13870 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
13880 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
13890 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
138a0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
138b0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
138c0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
138d0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
138e0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
138f0 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
13900 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
13910 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
13920 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
13930 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
13940 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
13950 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
13960 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13970 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
13980 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
13990 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
139a0 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
139b0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
139c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
139d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
139e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
139f0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
13a00 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
13a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13a30 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
13a40 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
13a50 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
13a60 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
13a70 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
13a80 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
13a90 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
13aa0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
13ab0 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
13ac0 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
13ad0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
13ae0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
13af0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
13b00 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
13b10 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
13b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13b30 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
13b40 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
13b50 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
13b60 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
13b70 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
13b80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13b90 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
13ba0 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
13bb0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
13bc0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
13bd0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
13be0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
13bf0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
13c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
13c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13c20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13c30 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13c40 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
13c50 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
13c60 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
13c70 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
13c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
13c90 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
13ca0 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
13cb0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
13cc0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
13cd0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
13ce0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
13cf0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
13d00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13d10 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
13d20 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
13d30 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
13d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13d50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13d60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13d70 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
13d80 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
13d90 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
13da0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
13db0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
13dc0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
13dd0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
13de0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
13df0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
13e00 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
13e10 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
13e20 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
13e30 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
13e40 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
13e50 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
13e60 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
13e70 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
13e80 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
13e90 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
13ea0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
13eb0 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
13ec0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
13ed0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
13ee0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
13ef0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
13f00 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
13f10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
13f20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13f30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13f40 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
13f50 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
13f60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13f70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
13f80 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
13f90 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
13fa0 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
13fb0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
13fc0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
13fd0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
13fe0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
13ff0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
14000 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
14010 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
14020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14030 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
14040 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
14050 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
14060 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
14070 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
14080 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
14090 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
140a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
140b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
140c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
140d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
140e0 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
140f0 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
14100 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
14110 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
14120 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
14130 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
14140 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
14150 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
14160 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
14170 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
14180 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
14190 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
141a0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
141b0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50  Bt, iLastPg, &pP
141c0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
141d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
141e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
141f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
14200 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
14210 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
14220 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
14230 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
14240 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
14250 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14260 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14290 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
142a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
142b0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
142c0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
142d0 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20   iLastPg);.  }. 
142e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
142f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
14300 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14310 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
14320 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
14330 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
14340 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
14350 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
14360 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
14370 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
14380 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
14390 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
143a0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
143b0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
143c0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
143d0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
143e0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
143f0 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
14400 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
14410 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
14420 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
14430 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
14440 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
14450 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14460 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
14470 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
14480 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
14490 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
144a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
144b0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
144c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
144d0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
144e0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
144f0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
14500 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
14510 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
14520 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
14530 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
14540 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
14550 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
14560 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
14570 65 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72  ep(pBt, 0, pager
14580 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b  Pagecount(pBt));
14590 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
145a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
145b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
145c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
145d0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
145e0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
145f0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
14600 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
14610 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
14620 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
14630 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
14640 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
14650 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
14660 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
14670 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
14680 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14690 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
146a0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
146b0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
146c0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
146d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
146e0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
146f0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
14700 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
14710 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
14720 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
14730 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
14740 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
14750 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
14760 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
14770 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
14780 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
14790 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
147a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
147b0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
147c0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
147d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
147e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
147f0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
14800 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
14810 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
14820 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
14830 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
14840 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
14850 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20   nFin;.    Pgno 
14860 6e 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20  nFree;.    Pgno 
14870 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e  nPtrmap;.    Pgn
14880 6f 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e  o iFree;.    con
14890 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
148a0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
148b0 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61   Pgno nOrig = pa
148c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
148d0 29 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d  );..    if( PTRM
148e0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
148f0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
14900 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
14910 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
14920 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
14930 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
14940 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
14950 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
14960 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
14970 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
14980 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
14990 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
149a0 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
149b0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
149c0 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
149d0 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
149e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
149f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14a00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
14a10 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
14a20 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
14a30 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
14a40 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
14a50 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
14a60 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
14a70 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
14a80 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20  sz/5);.    nFin 
14a90 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
14aa0 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69  - nPtrmap;.    i
14ab0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
14ac0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
14ad0 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
14ae0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
14af0 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
14b00 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
14b10 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
14b20 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
14b30 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
14b40 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
14b50 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
14b60 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
14b70 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
14b80 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
14b90 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
14ba0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
14bb0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
14bc0 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
14bd0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
14be0 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
14bf0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
14c00 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
14c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14c20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14c30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
14c40 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
14c50 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
14c60 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
14c70 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
14c80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
14c90 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
14ca0 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
14cb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
14cc0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
14cd0 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
14ce0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
14cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14d00 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14d10 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14d20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14d30 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
14d40 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
14d50 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
14d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
14d70 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53  ndif /* ifndef S
14d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14d90 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
14da0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
14db0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
14dc0 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
14dd0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
14de0 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
14df0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
14e00 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
14e10 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
14e20 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
14e30 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
14e40 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
14e50 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
14e60 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
14e70 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
14e80 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
14e90 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
14ea0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
14eb0 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
14ec0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
14ed0 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
14ee0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
14ef0 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
14f00 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
14f10 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
14f20 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
14f30 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
14f40 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
14f50 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
14f60 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
14f70 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
14f80 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
14f90 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
14fa0 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
14fb0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
14fc0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
14fd0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
14fe0 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
14ff0 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
15000 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
15010 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
15020 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
15030 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
15040 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
15050 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
15060 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
15070 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
15080 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
15090 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
150a0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
150b0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
150c0 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
150d0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
150e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
150f0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
15100 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
15110 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
15120 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
15130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
15140 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
15150 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
15160 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
15170 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
15180 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
15190 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
151a0 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
151b0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
151c0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
151d0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
151e0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
151f0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
15200 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
15210 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
15220 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
15230 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
15240 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
15250 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
15260 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
15270 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
15280 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
15290 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
152a0 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
152b0 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
152c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
152d0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
152e0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
152f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
15300 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
15310 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
15320 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
15330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15340 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
15350 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
15360 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
15370 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15380 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15390 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
153a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
153b0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
153c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
153d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
153e0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
153f0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
15400 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
15420 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
15430 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
15450 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
15460 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
15470 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
15480 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
15490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
154a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
154b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
154c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
154d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
154e0 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
154f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
15500 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
15510 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
15520 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
15530 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
15540 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15550 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
15560 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
15570 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
15580 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
15590 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
155a0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
155b0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
155c0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
155d0 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
155e0 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
155f0 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
15600 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
15610 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
15620 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
15630 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
15640 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
15650 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
15660 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
15670 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
15680 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
15690 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
156a0 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
156b0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
156c0 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
156d0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
156e0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
156f0 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
15700 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ks..**.** This w
15710 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
15720 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
15730 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15740 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
15750 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
15760 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
15770 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
15780 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
15790 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
157a0 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29  aseTwo(Btree *p)
157b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
157c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
157d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
157e0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
157f0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
15800 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
15810 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
15820 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
15830 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
15840 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
15850 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
15860 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
15870 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
15880 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
15890 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
158a0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
158b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
158c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
158d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
158e0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
158f0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
15900 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
15910 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
15920 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
15930 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
15940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15950 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15960 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
15970 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15980 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
15990 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
159a0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
159b0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
159c0 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  s any kind of tr
159d0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
159e0 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72  decrement the tr
159f0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
15a00 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
15a10 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
15a20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
15a30 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  nt reaches 0, se
15a40 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65  t.  ** the share
15a50 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
15a60 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
15a70 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
15a80 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a   call below.  **
15a90 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
15aa0 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   pager..  */.  i
15ab0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
15ac0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
15ad0 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
15ae0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
15af0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
15b00 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
15b10 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
15b20 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
15b30 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15b40 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
15b50 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
15b60 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
15b70 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
15b80 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
15b90 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
15ba0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
15bb0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
15bc0 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
15bd0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
15be0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 62 74 72 65  ion..  */.  btre
15bf0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
15c00 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72  (pBt);.  p->inTr
15c10 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
15c20 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
15c30 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
15c40 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
15c50 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
15c60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15c70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15c80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
15c90 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
15ca0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
15cb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
15cc0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
15cd0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
15ce0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
15cf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
15d00 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
15d10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
15d20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15d30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
15d40 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
15d50 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
15d60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15d70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15d80 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
15d90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15da0 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
15db0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
15dc0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
15dd0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
15de0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
15df0 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
15e00 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
15e10 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
15e20 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
15e30 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
15e40 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
15e50 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
15e60 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
15e70 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
15e80 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
15e90 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
15ea0 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
15eb0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
15ec0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
15ed0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
15ee0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
15ef0 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
15f00 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
15f10 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
15f20 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
15f30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
15f40 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
15f50 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
15f60 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
15f70 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
15f80 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
15f90 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
15fa0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
15fb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
15fc0 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
15fd0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
15fe0 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
15ff0 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
16000 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
16010 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
16020 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
16030 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
16040 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
16050 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
16060 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
16070 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
16080 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
16090 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
160a0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
160b0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
160c0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
160d0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
160e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
160f0 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
16100 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
16110 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
16120 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16130 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
16140 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
16150 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
16160 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
16170 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
16180 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
16190 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
161a0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
161b0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
161c0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
161d0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
161e0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
161f0 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
16200 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
16210 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
16220 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
16230 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
16240 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
16250 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
16260 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
16270 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16280 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
16290 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
162a0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
162b0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
162c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
162d0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
162e0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
162f0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
16300 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
16310 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
16320 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
16330 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
16340 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
16350 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
16360 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
16370 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
16380 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
16390 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
163a0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
163b0 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
163c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
163d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
163e0 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
163f0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
16400 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
16410 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
16420 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
16430 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
16440 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
16450 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
16460 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
16470 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
16480 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16490 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
164a0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
164b0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
164c0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
164d0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
164e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
164f0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
16500 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
16510 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
16520 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
16530 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
16540 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16550 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
16560 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
16570 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16580 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
16590 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
165a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
165b0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65  (p);.  rc = save
165c0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
165d0 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
165e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
165f0 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
16600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16610 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
16620 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
16630 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
16640 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
16650 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  rred whilst.    
16660 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
16670 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
16680 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
16690 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
166a0 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
166b0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
166c0 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
166d0 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
166e0 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
166f0 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
16700 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
16710 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
16720 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
16730 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
16740 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
16750 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
16760 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
16770 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
16780 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
16790 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
167a0 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
167b0 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
167c0 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
167d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
167e0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
167f0 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a  Cursors(p, rc);.
16800 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
16810 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
16820 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
16830 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
16840 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
16850 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
16860 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
16870 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
16880 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
16890 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
168a0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
168b0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
168c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
168d0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
168e0 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
168f0 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
16900 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
16910 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
16920 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c  .    ** call sql
16930 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
16940 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
16950 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
16960 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
16970 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
16980 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
16990 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ( sqlite3BtreeGe
169a0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
169b0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
169c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
169d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
169e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
169f0 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
16a00 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
16a10 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
16a20 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
16a30 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66  _READ;.  }..  if
16a40 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
16a50 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
16a60 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
16a70 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
16a80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
16a90 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
16aa0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
16ab0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
16ac0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
16ad0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
16ae0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
16af0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
16b00 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
16b10 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
16b20 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70  ontent(pBt);.  p
16b30 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
16b40 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b  S_NONE;.  unlock
16b50 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
16b60 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  t);..  btreeInte
16b70 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
16b80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16b90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16ba0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
16bb0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
16bc0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
16bd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
16be0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
16bf0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
16c00 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
16c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
16c20 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
16c30 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
16c40 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
16c50 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
16c60 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
16c70 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
16c80 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
16c90 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
16ca0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
16cb0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
16cc0 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
16cd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
16ce0 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
16cf0 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
16d00 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
16d10 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
16d20 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
16d30 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
16d40 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
16d50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
16d60 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
16d70 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
16d80 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
16d90 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
16da0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
16db0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
16dc0 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
16dd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
16de0 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
16df0 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
16e00 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
16e10 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
16e20 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
16e30 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
16e40 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
16e50 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
16e60 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
16e70 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
16e80 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
16e90 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
16ea0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
16eb0 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
16ec0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
16ed0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
16ee0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
16ef0 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
16f00 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
16f10 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
16f20 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
16f30 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
16f40 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
16f50 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
16f60 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
16f70 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
16f80 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
16f90 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
16fa0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
16fb0 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
16fc0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
16fd0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16fe0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16ff0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
17000 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
17010 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
17020 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65   assert( pBt->re
17030 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
17040 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
17050 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
17060 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
17070 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
17080 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
17090 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
170a0 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61  RITE || pBt->rea
170b0 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63  dOnly) ){.    rc
170c0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
170d0 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AL;.  }else{.   
170e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
170f0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
17100 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
17110 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
17120 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
17130 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
17140 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
17150 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64  th.    ** an ind
17160 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
17170 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
17180 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
17190 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53  y using.    ** S
171a0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
171b0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
171c0 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
171d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
171e0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
171f0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
17200 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
17210 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
17220 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f  s active..    */
17230 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17240 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
17250 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
17260 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
17270 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
17280 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17290 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
172a0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
172b0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
172c0 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
172d0 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
172e0 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
172f0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
17300 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
17310 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
17320 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
17330 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
17340 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
17350 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
17360 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
17370 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
17380 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
17390 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
173a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
173b0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
173c0 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
173d0 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
173e0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
173f0 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
17400 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
17410 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
17420 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
17430 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
17440 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
17450 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
17460 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
17470 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
17480 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
17490 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
174a0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
174b0 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
174c0 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
174d0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
174e0 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
174f0 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
17500 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
17510 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17520 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
17530 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
17540 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
17550 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17560 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
17570 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
17580 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
17590 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
175a0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
175b0 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
175c0 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
175d0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
175e0 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
175f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17600 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
17610 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
17620 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
17630 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
17640 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
17650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17660 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
17670 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
17680 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17690 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
176a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
176b0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
176c0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
176d0 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
176e0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
176f0 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
17700 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
17710 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
17720 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
17730 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17740 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
17750 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
17760 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
17770 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
17780 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
17790 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
177a0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
177b0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
177c0 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
177d0 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
177e0 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
177f0 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
17800 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
17810 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
17820 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
17830 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
17840 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
17850 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
17860 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
17870 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
17880 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
17890 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
178a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
178b0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
178c0 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
178d0 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
178e0 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
178f0 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
17900 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
17910 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
17920 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
17930 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
17940 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
17950 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
17960 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
17970 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
17980 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
17990 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
179a0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
179b0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
179c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
179d0 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
179e0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
179f0 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
17a00 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
17a10 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
17a20 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
17a30 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
17a40 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
17a50 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
17a60 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
17a70 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
17a80 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
17a90 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
17aa0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
17ab0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
17ac0 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
17ad0 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
17ae0 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
17af0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
17b00 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
17b10 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65  ursorSize() byte
17b20 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  s of memory .** 
17b30 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43  pointed to by pC
17b40 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72  ur have been zer
17b50 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  oed by the calle
17b60 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
17b70 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
17b80 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
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 2f 2a 20 54 68 65 20 62 74         /* The bt
17bb0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
17bc0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
17bf0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
17c00 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
17c30 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
17c40 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
17c50 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
17c60 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
17c70 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
17c80 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
17c90 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
17ca0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
17cd0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
17ce0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
17cf0 6e 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  nPage;.  BtShare
17d00 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17d10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17d20 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
17d30 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
17d40 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
17d50 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  wrFlag==1 );.  i
17d60 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
17d70 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
17d80 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 69  eadOnly );.    i
17d90 66 28 20 4e 45 56 45 52 28 70 42 74 2d 3e 72 65  f( NEVER(pBt->re
17da0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
17db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
17dc0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
17dd0 20 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72     rc = checkFor
17de0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
17df0 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a   iTable, 0, 0);.
17e00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17e10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
17e20 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
17e30 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
17e40 41 43 48 45 20 29 3b 0a 20 20 20 20 20 20 72 65  ACHE );.      re
17e50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
17e60 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
17e70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
17e80 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
17e90 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
17ea0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17eb0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
17ec0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
17ed0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
17ee0 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
17ef0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17f00 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17f10 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 20  t->pPager, (int 
17f20 2a 29 26 6e 50 61 67 65 29 3b 20 0a 20 20 69 66  *)&nPage); .  if
17f30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17f40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17f50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
17f60 6c 65 3d 3d 31 20 26 26 20 6e 50 61 67 65 3d 3d  le==1 && nPage==
17f70 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
17f80 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
17f90 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
17fa0 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
17fb0 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
17fc0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
17fd0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
17fe0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
17ff0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18000 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
18010 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
18020 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
18030 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
18040 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
18050 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
18060 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
18070 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
18080 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
18090 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
180a0 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
180b0 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
180c0 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
180d0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
180e0 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
180f0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
18100 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
18110 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
18120 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
18130 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
18140 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
18150 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
18160 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
18170 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
18180 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
18190 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
181a0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
181b0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
181c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
181d0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
181e0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
181f0 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
18200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61  SQLITE_OK;..crea
18210 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
18220 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  ion:.  releasePa
18230 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
18240 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  0]);.  unlockBtr
18250 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
18260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18270 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18280 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
18290 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
182c0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
182d0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
18300 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
18310 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
18320 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18340 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
18350 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
18360 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
18370 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18390 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
183a0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
183b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
183e0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
183f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
18400 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
18410 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
18420 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
18430 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
18440 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
18450 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18460 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18470 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18480 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
18490 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
184a0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
184b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
184c0 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
184d0 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
184e0 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
184f0 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
18500 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
18510 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
18520 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
18530 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
18540 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
18550 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
18560 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
18570 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
18580 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
18590 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
185a0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
185b0 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
185c0 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43  eturn sizeof(BtC
185d0 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ursor);.}../*.**
185e0 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
185f0 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
18600 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
18610 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
18620 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
18630 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
18640 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
18650 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
18660 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
18670 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
18680 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
18690 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
186a0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
186b0 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
186c0 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
186d0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
186e0 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
186f0 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
18700 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
18710 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
18720 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
18730 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
18740 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
18750 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
18760 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
18770 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
18780 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
18790 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
187a0 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
187b0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
187c0 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
187d0 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
187e0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
187f0 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
18800 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
18810 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
18820 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
18830 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
18840 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
18850 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
18860 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
18870 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
18880 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
18890 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
188a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
188b0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
188c0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
188d0 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
188e0 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
188f0 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
18900 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
18910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18920 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
18930 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
18940 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
18950 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
18960 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
18970 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
18980 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
18990 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
189a0 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
189b0 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
189c0 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
189d0 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
189e0 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
189f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
18a00 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
18a10 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
18a20 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
18a30 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
18a40 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
18a50 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
18a60 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
18a70 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
18a80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18a90 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
18aa0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
18ab0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
18ac0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18ad0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
18ae0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
18af0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
18b00 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
18b10 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
18b20 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18b30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18b40 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
18b50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18b60 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
18b70 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
18b80 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
18b90 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
18ba0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
18bb0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
18bc0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
18bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
18be0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
18bf0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
18c00 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
18c10 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
18c20 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
18c30 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
18c40 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
18c50 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
18c60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
18c70 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
18c80 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
18c90 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
18ca0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
18cb0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
18cc0 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
18cd0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
18ce0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
18cf0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18d00 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
18d10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18d20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18d30 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
18d40 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
18d50 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
18d60 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
18d70 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
18d80 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
18d90 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
18da0 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
18db0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
18dc0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
18dd0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
18de0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70   BtCursor *pTemp
18df0 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
18e00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
18e10 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
18e20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d  );.  memcpy(pTem
18e30 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65  pCur, pCur, size
18e40 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20  of(BtCursor));. 
18e50 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74   pTempCur->pNext
18e60 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72   = 0;.  pTempCur
18e70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66  ->pPrev = 0;.  f
18e80 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70  or(i=0; i<=pTemp
18e90 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
18ea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
18eb0 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
18ec0 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61  apPage[i]->pDbPa
18ed0 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
18ee0 74 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65  t( pTempCur->pKe
18ef0 79 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  y==0 );.}../*.**
18f00 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72   Delete a tempor
18f10 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20  ary cursor such 
18f20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74  as was made by t
18f30 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61  he CreateTempora
18f40 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75  ryCursor().** fu
18f50 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f  nction above..*/
18f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
18f70 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
18f80 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
18f90 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
18fa0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
18fb0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
18fc0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
18fd0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
18fe0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
18ff0 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 61  gerUnref(pCur->a
19000 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
19010 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
19020 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
19030 79 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  y);.}..../*.** M
19040 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
19050 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
19060 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
19070 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
19080 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
19090 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
190a0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
190b0 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65  , call.** sqlite
190c0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
190d0 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
190e0 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
190f0 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
19100 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
19110 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
19120 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
19130 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
19140 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
19150 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  f calls to sqlit
19160 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
19170 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
19180 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
19190 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
191a0 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
191b0 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
191c0 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
191d0 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
191e0 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
191f0 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
19200 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
19210 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
19220 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
19230 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
19240 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
19250 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
19260 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
19270 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
19280 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
19290 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
192a0 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
192b0 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
192c0 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
192d0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
192e0 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
192f0 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
19300 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
19310 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
19320 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
19330 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
19340 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
19350 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
19360 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
19370 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
19380 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
19390 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
193a0 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
193b0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
193c0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
193d0 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
193e0 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
193f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
19400 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
19410 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
19420 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
19430 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
19440 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
19450 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
19460 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
19470 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
19480 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
19490 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
194a0 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
194b0 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
194c0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
194d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
194e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
194f0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
19500 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
19510 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
19520 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19530 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
19540 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
19550 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
19560 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
19570 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
19580 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  NKey = 1;.    }e
19590 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
195a0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
195b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
195c0 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
195d0 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
195e0 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
195f0 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
19600 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
19610 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
19620 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
19630 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
19680 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
196d0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33     \.    sqlite3
19720 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
19730 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
19740 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
19750 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
19760 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
19770 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
19810 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
19820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19850 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
19860 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
19870 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
19880 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
19890 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
198a0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
198b0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
198c0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
198d0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
198e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
198f0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
19900 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
19910 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
19920 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
19930 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
19940 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
19950 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
19960 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
19970 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
19980 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19990 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
199a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
199b0 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
199c0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
199d0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
199e0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
199f0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19a00 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
19a10 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
19a20 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
19a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19a40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19a50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19a60 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
19a70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19a80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
19a90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19aa0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
19ab0 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
19ac0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
19ad0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
19ae0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
19af0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
19b00 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
19b10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19b20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
19b30 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
19b40 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
19b50 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
19b60 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
19b70 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
19b80 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
19b90 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
19ba0 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
19bb0 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
19bc0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
19bd0 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
19be0 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
19bf0 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
19c00 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
19c10 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
19c20 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
19c30 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
19c40 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
19c50 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
19c60 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
19c70 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
19c80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
19c90 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19ca0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19cb0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
19cc0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
19cd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
19cf0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19d00 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
19d10 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
19d20 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19d30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
19d40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19d50 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
19d60 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
19d70 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
19d80 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
19d90 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
19da0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
19db0 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
19dc0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
19dd0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
19de0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
19df0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19e00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
19e10 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
19e20 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
19e30 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
19e40 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
19e50 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
19e60 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
19e70 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
19e80 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
19e90 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
19ea0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
19eb0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
19ec0 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
19ed0 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
19ee0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
19ef0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
19f00 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
19f10 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
19f20 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
19f30 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
19f40 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
19f50 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
19f60 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
19f70 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
19f80 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
19f90 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
19fa0 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
19fb0 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
19fc0 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
19fd0 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
19fe0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
19ff0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1a000 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1a010 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1a020 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1a030 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1a040 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1a050 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1a060 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1a070 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1a080 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1a090 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1a0a0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1a0b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1a0c0 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1a0d0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1a0e0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1a0f0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1a100 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1a110 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1a120 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1a130 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1a140 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1a150 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1a160 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1a170 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1a180 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1a190 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1a1a0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1a1b0 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1a1c0 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1a1d0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1a1e0 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f  ed *pBt, .  Pgno
1a1f0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1a200 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72           /* Over
1a210 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d  flow page */.  M
1a220 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1a230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a240 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
1a250 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
1a260 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
1a270 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
1a280 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
1a290 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1a2a0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
1a2b0 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
1a2c0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1a2d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a2e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1a2f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1a300 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1a310 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
1a320 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
1a330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a340 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
1a350 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
1a360 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1a370 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
1a380 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
1a390 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
1a3a0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
1a3b0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
1a3c0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
1a3d0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
1a3e0 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
1a3f0 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
1a400 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
1a410 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
1a420 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
1a430 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
1a440 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
1a450 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
1a460 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
1a470 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
1a480 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1a490 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1a4a0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
1a4b0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
1a4c0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
1a4d0 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
1a4e0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1a4f0 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
1a500 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
1a510 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1a520 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
1a530 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
1a540 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63  uess<=pagerPagec
1a550 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
1a560 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1a570 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
1a580 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
1a590 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1a5a0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
1a5b0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1a5c0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
1a5d0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
1a5e0 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
1a5f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1a600 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1a610 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1a620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a630 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1a640 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1a650 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1a660 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1a670 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1a680 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
1a690 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
1a6a0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1a6b0 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1a6c0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1a6d0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1a6e0 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1a6f0 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1a700 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1a710 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1a720 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1a730 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1a740 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1a750 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1a760 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1a770 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1a780 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1a790 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1a7a0 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1a7b0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1a7c0 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1a7d0 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1a7e0 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1a7f0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1a800 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1a810 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1a820 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1a830 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1a840 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1a850 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1a860 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1a870 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1a880 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1a890 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1a8a0 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1a8b0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1a8c0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1a8d0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1a8e0 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1a8f0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1a900 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a910 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1a920 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1a930 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1a940 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1a950 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1a960 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1a970 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1a980 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1a990 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1a9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1a9b0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1a9c0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a9e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1a9f0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1aa00 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1aa10 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1aa20 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1aa30 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1aa40 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1aa50 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1aa60 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1aa70 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1aa80 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1aa90 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1aaa0 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1aab0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1aac0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1aad0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1aae0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1aaf0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1ab00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ab10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ab20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1ab30 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1ab40 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1ab50 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1ab60 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1ab70 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1ab80 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1ab90 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1aba0 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1abb0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1abc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1abd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1abe0 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1abf0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1ac00 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1ac10 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1ac20 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1ac30 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1ac40 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1ac50 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1ac60 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1ac70 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1ac80 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1ac90 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1aca0 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1acb0 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1acc0 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1acd0 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1ace0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1acf0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1ad00 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1ad10 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1ad20 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1ad30 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1ad40 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1ad50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ad60 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
1ad70 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
1ad80 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
1ad90 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
1ada0 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
1adb0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
1adc0 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
1add0 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
1ade0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1adf0 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
1ae00 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1ae10 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
1ae20 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
1ae30 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1ae40 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1ae50 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1ae60 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1ae70 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1ae80 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1ae90 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1aea0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1aeb0 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1aec0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1aed0 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1aee0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1aef0 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1af00 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1af10 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1af20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1af30 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1af40 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1af50 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1af60 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1af70 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1af80 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1af90 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1afa0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1afb0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1afc0 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1afd0 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1afe0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1aff0 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1b000 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1b010 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1b020 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1b030 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1b040 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1b050 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1b060 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1b070 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1b080 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1b090 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1b0a0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1b0b0 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1b0c0 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1b0d0 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1b0e0 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1b0f0 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1b100 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1b110 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1b120 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1b130 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1b140 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1b150 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1b160 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1b170 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1b180 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1b190 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1b1a0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1b1b0 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1b1c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b1d0 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1b1e0 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1b1f0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1b200 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1b210 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1b220 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
1b230 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
1b240 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
1b250 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1b260 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1b270 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1b280 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1b290 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1b2a0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1b2b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1b2c0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1b2d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1b2e0 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1b2f0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1b300 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1b310 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b320 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1b330 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1b340 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1b350 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1b360 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1b370 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1b380 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1b390 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1b3a0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1b3b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b3c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b3d0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1b3e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b3f0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1b400 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1b410 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1b420 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1b430 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1b440 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1b450 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1b460 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1b470 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1b480 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1b490 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1b4a0 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1b4b0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1b4c0 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
1b4d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
1b4e0 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
1b4f0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a  ur->info.nData .
1b500 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
1b510 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1b520 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
1b530 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
1b540 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
1b550 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
1b560 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
1b570 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
1b580 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
1b590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b5a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b5b0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1b5c0 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
1b5d0 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
1b5e0 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
1b5f0 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
1b600 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
1b610 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1b620 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
1b630 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
1b640 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
1b650 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
1b660 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1b670 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
1b680 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
1b690 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1b6a0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
1b6b0 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
1b6c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
1b6d0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1b6e0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
1b6f0 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
1b700 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
1b710 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1b720 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1b730 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1b740 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
1b750 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
1b760 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1b770 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
1b780 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
1b790 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
1b7a0 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
1b7b0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
1b7c0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
1b7d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1b7e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1b7f0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1b800 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1b810 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1b820 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
1b830 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
1b840 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
1b850 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1b860 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
1b870 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
1b880 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
1b890 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
1b8a0 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
1b8b0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
1b8c0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1b8d0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
1b8e0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
1b8f0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1b900 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
1b910 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
1b920 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
1b930 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
1b940 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
1b950 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
1b960 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
1b970 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
1b980 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
1b990 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1b9a0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1b9b0 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1b9c0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
1b9d0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
1b9e0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
1b9f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1ba00 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
1ba10 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
1ba20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
1ba30 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
1ba40 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
1ba50 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
1ba60 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
1ba70 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1ba80 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1ba90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1baa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bab0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
1bac0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1bad0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1bae0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1baf0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
1bb00 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
1bb10 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
1bb20 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
1bb30 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
1bb40 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
1bb50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1bb60 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1bb70 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
1bb80 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
1bb90 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
1bba0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
1bbb0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1bbc0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1bbd0 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
1bbe0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
1bbf0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
1bc00 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
1bc10 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1bc20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
1bc30 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
1bc40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bc50 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1bc60 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
1bc70 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
1bc80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1bc90 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
1bca0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1bcb0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1bcc0 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
1bcd0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1bce0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
1bcf0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
1bd00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
1bd10 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1bd20 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
1bd30 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1bd40 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
1bd50 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
1bd60 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
1bd70 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
1bd80 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
1bd90 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
1bda0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1bdb0 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
1bdc0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1bdd0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
1bde0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
1bdf0 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
1be00 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
1be10 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
1be20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
1be30 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
1be40 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
1be50 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
1be60 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
1be70 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
1be80 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
1be90 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1bea0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1beb0 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
1bec0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1bed0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1bee0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
1bef0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1bf00 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1bf10 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
1bf20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
1bf30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1bf40 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1bf50 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
1bf60 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
1bf70 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
1bf80 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1bf90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1bfa0 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
1bfb0 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
1bfc0 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
1bfd0 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
1bfe0 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
1bff0 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
1c000 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
1c010 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
1c020 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
1c030 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
1c040 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
1c050 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1c060 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c070 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
1c080 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
1c090 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
1c0a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c0b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c0c0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
1c0d0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1c0e0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
1c0f0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1c100 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
1c110 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
1c120 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
1c130 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
1c140 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
1c150 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
1c160 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c170 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
1c180 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1c190 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
1c1a0 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
1c1b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1c1c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c1d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1c1e0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1c1f0 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
1c200 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
1c210 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
1c220 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c230 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1c240 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1c250 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1c260 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c270 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1c280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c290 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1c2a0 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
1c2b0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1c2c0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1c2d0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1c2e0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1c2f0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1c300 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1c310 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1c320 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1c330 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1c340 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1c350 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1c360 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1c370 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1c380 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1c390 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1c3a0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1c3b0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1c3c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1c3d0 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
1c3e0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1c3f0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1c400 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1c410 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1c420 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1c430 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1c440 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1c450 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1c460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c470 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1c480 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c490 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1c4a0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1c4b0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1c4c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c4d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1c4e0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1c4f0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
1c500 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c510 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1c520 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1c530 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1c540 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1c550 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1c560 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1c570 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1c580 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1c590 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1c5a0 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20  *)pBuf, 0, 0);. 
1c5b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c5c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1c5d0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1c5e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1c5f0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1c600 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1c610 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1c620 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1c630 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1c640 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1c650 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1c660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1c670 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1c680 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1c690 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1c6a0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1c6b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1c6c0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1c6d0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1c6e0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1c6f0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1c700 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1c710 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1c720 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1c730 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1c740 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1c750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1c760 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1c770 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c780 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1c790 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c7a0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1c7b0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1c7c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c7d0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1c7e0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1c7f0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1c800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c810 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c820 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c830 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1c840 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1c850 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1c860 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1c870 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1c880 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1c890 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1c8a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1c8b0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1c8c0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1c8d0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1c8e0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1c8f0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
1c900 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c910 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1c920 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1c930 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1c940 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1c950 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1c960 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1c970 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1c980 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1c990 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1c9a0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1c9b0 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1c9c0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1c9d0 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1c9e0 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1c9f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1ca00 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1ca10 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1ca20 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1ca30 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1ca40 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1ca50 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1ca60 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1ca70 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1ca80 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1ca90 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1caa0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1cab0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1cac0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1cad0 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1cae0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1caf0 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1cb00 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1cb10 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1cb20 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1cb30 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1cb40 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1cb50 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1cb60 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1cb70 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1cb80 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1cb90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1cba0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1cbb0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1cbc0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1cbd0 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1cbe0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1cbf0 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1cc00 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1cc10 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1cc20 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1cc30 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
1cc40 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
1cc50 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
1cc60 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1cc70 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
1cc80 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
1cc90 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
1cca0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
1ccb0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1ccc0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
1ccd0 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
1cce0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1ccf0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1cd00 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1cd10 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1cd20 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1cd30 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
1cd40 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
1cd50 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1cd60 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
1cd70 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
1cd80 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
1cd90 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
1cda0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1cdb0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1cdc0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1cdd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1cde0 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
1cdf0 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
1ce00 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
1ce10 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
1ce20 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1ce30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1ce40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ce50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ce60 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1ce70 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1ce80 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
1ce90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1cea0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1ceb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1cec0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1ced0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1cee0 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
1cef0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1cf00 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1cf10 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
1cf20 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
1cf30 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
1cf40 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1cf50 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
1cf60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
1cf70 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
1cf80 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1cf90 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1cfa0 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1cfb0 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1cfc0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1cfd0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1cfe0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1cff0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1d000 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1d010 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1d020 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1d030 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1d040 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1d050 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1d060 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1d070 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1d080 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1d090 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1d0a0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1d0b0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1d0c0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1d0d0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1d0e0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1d0f0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1d100 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1d110 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1d120 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1d130 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1d140 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1d150 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1d160 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1d170 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1d180 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1d190 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
1d1a0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
1d1b0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
1d1c0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
1d1d0 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
1d1e0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
1d1f0 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
1d200 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
1d210 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
1d220 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1d230 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1d240 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
1d250 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
1d260 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
1d270 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1d280 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
1d290 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
1d2a0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
1d2b0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
1d2c0 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
1d2d0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1d2e0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  t){.  assert( cu
1d2f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d300 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
1d310 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d320 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1d330 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
1d340 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
1d350 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
1d360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1d370 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
1d380 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
1d390 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
1d3a0 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
1d3b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d3c0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d3d0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
1d3e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d3f0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1d400 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
1d410 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1d420 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
1d430 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1d440 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1d450 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1d460 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
1d470 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
1d480 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
1d490 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
1d4a0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
1d4b0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
1d4c0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1d4d0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
1d4e0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
1d4f0 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
1d500 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
1d510 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
1d520 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
1d530 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1d540 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
1d550 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1d560 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1d570 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1d580 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1d590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d5a0 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
1d5b0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
1d5c0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1d5d0 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
1d5e0 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
1d5f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d600 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1d610 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
1d620 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
1d630 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b  gno, &pNewPage);
1d640 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1d650 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
1d660 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
1d670 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
1d680 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
1d690 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
1d6a0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1d6b0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1d6c0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1d6d0 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
1d6e0 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72  nCell<1 ){.    r
1d6f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d700 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1d710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d720 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  K;.}..#ifndef ND
1d730 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
1d740 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
1d750 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
1d760 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
1d770 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
1d780 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
1d790 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
1d7a0 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
1d7b0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
1d7c0 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
1d7d0 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
1d7e0 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
1d7f0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1d800 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
1d810 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
1d820 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
1d830 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
1d840 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
1d850 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1d860 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
1d870 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
1d880 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
1d890 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
1d8a0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
1d8b0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1d8c0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
1d8d0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
1d8e0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1d8f0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1d900 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1d910 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
1d920 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
1d930 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1d940 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1d950 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
1d960 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
1d970 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
1d980 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1d990 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
1d9a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1d9b0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
1d9c0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
1d9d0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
1d9e0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
1d9f0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
1da00 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
1da10 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
1da20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1da30 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
1da40 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
1da50 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
1da60 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
1da70 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1da80 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
1da90 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
1daa0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  ll index..*/.voi
1dab0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  d sqlite3BtreeMo
1dac0 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
1dad0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
1dae0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1daf0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1db00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1db10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1db20 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1db30 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
1db40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1db50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1db60 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
1db70 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
1db80 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
1db90 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
1dba0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1dbb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
1dbc0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
1dbd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1dbe0 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c  >pgno.  );.  rel
1dbf0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1dc00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1dc10 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  e]);.  pCur->iPa
1dc20 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ge--;.  pCur->in
1dc30 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1dc40 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1dc50 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  = 0;.}../*.** Mo
1dc60 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1dc70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   the root page.*
1dc80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1dc90 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
1dca0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
1dcb0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
1dcc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dcd0 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
1dce0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
1dcf0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1dd00 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
1dd10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1dd20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1dd30 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
1dd40 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
1dd50 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
1dd60 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
1dd70 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
1dd80 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
1dd90 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
1dda0 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
1ddb0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1ddc0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1ddd0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
1dde0 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
1ddf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1de00 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
1de10 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
1de20 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20  >skip;.    }.   
1de30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1de40 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1de50 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
1de60 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
1de70 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1de80 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=1; i<=pCur->iP
1de90 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1dea0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1deb0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1dec0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1ded0 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
1dee0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
1def0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1df00 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
1df10 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
1df20 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  0])).    ){.    
1df30 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1df40 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1df50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1df60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
1df70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
1df80 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
1df90 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
1dfa0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
1dfb0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
1dfc0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   0;.  pCur->aiId
1dfd0 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
1dfe0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1dff0 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  ;.  pCur->atLast
1e000 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1e010 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
1e020 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
1e030 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
1e040 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1e050 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73  subpage;.    ass
1e060 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
1e070 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61  ==1 );.    subpa
1e080 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
1e090 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
1e0a0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
1e0b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75  ;.    assert( su
1e0c0 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70  bpage>0 );.    p
1e0d0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1e0e0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
1e0f0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1e100 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
1e110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
1e120 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
1e130 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
1e140 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
1e150 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
1e160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e170 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1e180 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1e190 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1e1a0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1e1b0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
1e1c0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1e1d0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
1e1e0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
1e1f0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
1e200 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
1e210 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
1e220 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
1e230 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1e240 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1e250 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
1e260 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1e270 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1e280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e290 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1e2a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1e2b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1e2c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e2d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e2e0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1e2f0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1e300 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1e310 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e320 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
1e330 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1e340 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e350 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1e360 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
1e370 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
1e380 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1e390 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1e3a0 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
1e3b0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1e3c0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1e3d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e3e0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1e3f0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1e400 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
1e410 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1e420 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
1e430 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1e440 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
1e450 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
1e460 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
1e470 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1e480 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
1e490 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
1e4a0 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
1e4b0 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
1e4c0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1e4d0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
1e4e0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
1e4f0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1e500 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1e510 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1e520 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
1e530 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1e540 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
1e550 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
1e560 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
1e570 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
1e580 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1e590 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
1e5a0 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
1e5b0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1e5c0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1e5d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1e5e0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1e5f0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1e600 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e610 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e620 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e630 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e640 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1e650 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1e660 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1e670 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
1e680 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1e690 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1e6a0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1e6b0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1e6c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1e6d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
1e6e0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
1e6f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1e700 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1e710 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
1e730 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1e740 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
1e750 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
1e760 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1e770 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1e780 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
1e790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e7a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1e7b0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1e7c0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1e7d0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1e7e0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1e7f0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1e800 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1e810 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1e820 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1e830 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1e840 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1e850 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1e860 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
1e870 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1e880 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1e890 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1e8a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e8b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e8c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e8d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1e8e0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1e8f0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
1e900 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1e910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e920 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1e930 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e940 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1e950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1e960 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1e970 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
1e980 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1e990 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
1e9a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e9b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1e9c0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1e9d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1e9e0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
1e9f0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1ea00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1ea10 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1ea20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1ea30 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1ea40 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1ea50 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1ea60 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1ea70 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1ea80 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1ea90 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1eaa0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1eab0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1eac0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1ead0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1eae0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1eaf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1eb00 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
1eb10 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1eb20 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1eb30 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1eb40 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1eb50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1eb60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1eb70 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1eb80 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1eb90 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1eba0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1ebb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ebc0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1ebd0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1ebe0 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
1ebf0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1ec00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1ec10 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1ec20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1ec30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1ec40 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1ec50 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1ec60 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1ec70 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1ec80 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1ec90 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72  Cur);.      pCur
1eca0 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53  ->atLast = rc==S
1ecb0 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20  QLITE_OK ?1:0;. 
1ecc0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1ecd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1ece0 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
1ecf0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1ed00 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
1ed10 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
1ed20 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
1ed30 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
1ed40 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
1ed50 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
1ed60 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
1ed70 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
1ed80 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
1ed90 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
1eda0 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
1edb0 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
1edc0 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
1edd0 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
1ede0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
1edf0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
1ee00 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
1ee10 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
1ee20 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
1ee30 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
1ee40 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
1ee50 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
1ee60 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
1ee70 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
1ee80 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1ee90 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
1eea0 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
1eeb0 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
1eec0 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
1eed0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1eee0 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
1eef0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
1ef00 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
1ef10 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
1ef20 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
1ef30 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
1ef40 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
1ef50 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
1ef60 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
1ef70 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
1ef80 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1ef90 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
1efa0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1efb0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1efc0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efe0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1eff0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
1f000 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
1f010 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
1f020 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
1f030 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
1f040 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
1f050 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
1f060 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
1f070 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
1f080 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1f090 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1f0a0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1f0b0 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
1f0c0 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
1f0d0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
1f0e0 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
1f0f0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1f100 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1f110 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1f130 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
1f140 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
1f150 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f160 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
1f170 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
1f180 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
1f190 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
1f1a0 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
1f1b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
1f1c0 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
1f1d0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
1f1e0 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
1f1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f200 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
1f210 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
1f220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1f230 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
1f240 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
1f250 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
1f260 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
1f270 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
1f280 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
1f290 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1f2a0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1f2b0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f2c0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1f2d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1f2e0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1f2f0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
1f300 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1f310 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
1f320 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
1f330 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
1f340 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
1f350 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
1f360 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1f370 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
1f380 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1f390 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f3a0 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
1f3b0 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d  Key .   && pCur-
1f3c0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
1f3d0 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
1f3e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1f3f0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
1f400 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1f410 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f420 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
1f430 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  f( pCur->atLast 
1f440 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
1f450 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
1f460 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
1f470 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f480 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1f490 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
1f4a0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1f4b0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1f4c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1f4d0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1f4e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1f4f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f500 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f510 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
1f520 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1f530 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1f540 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
1f550 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
1f560 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1f570 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1f580 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1f590 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f5a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1f5b0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
1f5c0 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
1f5d0 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
1f5e0 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
1f5f0 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
1f600 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1f610 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1f620 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1f630 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b  .    int c = -1;
1f640 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e    /* pRes return
1f650 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70   if table is emp
1f660 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f  ty must be -1 */
1f670 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
1f680 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
1f690 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
1f6a0 28 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  (!pPage->intKey 
1f6b0 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 29 20 7c  && pIdxKey==0) |
1f6c0 7c 20 75 70 72 3c 30 20 29 7b 0a 20 20 20 20 20  | upr<0 ){.     
1f6d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1f6e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1f6f0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1f700 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ish;.    }.    i
1f710 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
1f720 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1f730 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1f740 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d   (u16)upr;.    }
1f750 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
1f760 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1f770 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70  age] = (u16)((up
1f780 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+lwr)/2);.    }
1f790 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
1f7a0 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
1f7b0 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43  ey;.      i64 nC
1f7c0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  ellKey;.      in
1f7d0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
1f7e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f7f0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
1f800 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1f810 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1f820 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Key = 1;.      i
1f830 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1f840 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
1f850 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pCell;.        p
1f860 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1f870 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
1f880 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
1f890 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1f8a0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
1f8b0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64  .          u32 d
1f8c0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
1f8d0 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69  pCell += getVari
1f8e0 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d  nt32(pCell, dumm
1f8f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
1f900 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
1f910 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
1f920 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1f930 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69   if( nCellKey==i
1f940 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
1f950 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
1f960 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
1f970 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
1f980 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
1f990 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f9a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f9b0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
1f9c0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
1f9d0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1f9e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f9f0 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61        int availa
1fa00 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ble;.        pCe
1fa10 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29  llKey = (void *)
1fa20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1fa30 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30  r, &available, 0
1fa40 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
1fa50 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
1fa60 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  .nKey;.        i
1fa70 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43  f( available>=nC
1fa80 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ellKey ){.      
1fa90 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1faa0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1fab0 28 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20  ((int)nCellKey, 
1fac0 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
1fad0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
1fae0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  e{.          pCe
1faf0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
1fb00 61 6c 6c 6f 63 28 20 28 69 6e 74 29 6e 43 65 6c  alloc( (int)nCel
1fb10 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  lKey );.        
1fb20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
1fb30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1fb40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1fb50 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
1fb60 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1fb70 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
1fb80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1fb90 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1fba0 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
1fbb0 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 2a 29 70 43  llKey, (void*)pC
1fbc0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1fbd0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
1fbe0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1fbf0 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70  (int)nCellKey, p
1fc00 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
1fc10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1fc20 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
1fc30 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
1fc40 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
1fc50 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1fc60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fc70 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
1fc80 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
1fc90 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
1fca0 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
1fcb0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1fcc0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1fcd0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
1fce0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
1fcf0 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
1fd00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1fd10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1fd20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
1fd30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
1fd40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fd50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
1fd60 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1fd70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fd80 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
1fd90 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
1fda0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1fdb0 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69  .        upr = i
1fdc0 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
1fdd0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
1fde0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
1fdf0 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
1fe00 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62  llKey;.        b
1fe10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1fe20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1fe30 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1fe40 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32  u16)((lwr+upr)/2
1fe50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1fe60 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
1fe70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fe80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1fe90 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1fea0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
1feb0 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
1fec0 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
1fed0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1fee0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1fef0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1ff00 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1ff10 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
1ff20 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
1ff30 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
1ff40 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
1ff50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ff60 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
1ff70 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ff80 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1ff90 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1ffa0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1ffb0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1ffc0 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1ffd0 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
1ffe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1fff0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
20000 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
20010 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20020 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
20030 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
20040 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
20050 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
20060 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
20070 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
20080 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
20090 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
200a0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
200b0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
200c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
200d0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
200e0 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
200f0 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
20100 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
20110 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
20120 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
20130 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
20140 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
20150 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
20160 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
20170 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
20180 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
20190 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
201a0 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
201b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
201c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
201d0 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
201e0 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
201f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
20200 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
20210 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
20220 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
20230 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
20240 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
20250 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
20260 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
20270 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
20280 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
20290 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
202a0 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
202b0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
202c0 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
202d0 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
202e0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
202f0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
20300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20310 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
20320 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20330 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
20340 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
20350 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
20360 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20  e[150];         
20370 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
20380 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
20390 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
203a0 2f 0a 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  /...  if( pKey )
203b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  {.    assert( nK
203c0 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b  ey==(i64)(int)nK
203d0 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  ey );.    pIdxKe
203e0 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  y = sqlite3VdbeR
203f0 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
20400 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
20410 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20  )nKey, pKey,.   
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f     aSpace, sizeo
20450 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20  f(aSpace));.    
20460 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
20470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20480 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
20490 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a     pIdxKey = 0;.
204a0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
204b0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
204c0 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78  acked(pCur, pIdx
204d0 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c  Key, nKey, bias,
204e0 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b   pRes);.  if( pK
204f0 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
20500 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
20510 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65  kedRecord(pIdxKe
20520 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
20530 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
20540 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
20550 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
20560 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
20570 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
20580 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
20590 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
205a0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
205b0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
205c0 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
205d0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
205e0 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
205f0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
20600 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
20610 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
20620 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
20630 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
20640 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
20650 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20660 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
20670 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
20680 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
20690 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
206a0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
206b0 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
206c0 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
206d0 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
206e0 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
206f0 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
20700 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
20710 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
20720 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
20730 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
20740 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
20750 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
20760 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
20770 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
20780 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
20790 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73  andle for a curs
207a0 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  or..*/.sqlite3 *
207b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
207c0 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72  orDb(const BtCur
207d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
207e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
207f0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
20800 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
20810 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ) );.  return pC
20820 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  ur->pBtree->db;.
20830 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
20840 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
20850 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
20860 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
20870 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
20880 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
20890 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
208a0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
208b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
208c0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
208d0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
208e0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
208f0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
20900 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
20910 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20920 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
20930 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
20940 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
20950 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
20960 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
20970 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20980 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20990 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
209a0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
209b0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
209c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
209d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
209e0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
209f0 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   );.  if( CURSOR
20a00 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
20a10 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
20a20 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
20a30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20a40 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
20a50 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  kip>0 ){.    pCu
20a60 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
20a70 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
20a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20a90 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
20aa0 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
20ab0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
20ac0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
20ad0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
20ae0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20af0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20b00 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
20b10 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67  ssert( idx<=pPag
20b20 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70  e->nCell );..  p
20b30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
20b40 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
20b50 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
20b60 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
20b70 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
20b80 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
20b90 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
20ba0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
20bb0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
20bc0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
20bd0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
20be0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20bf0 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  rc;.      rc = m
20c00 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
20c10 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  ur);.      *pRes
20c20 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
20c30 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20c40 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
20c50 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
20c60 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
20c70 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
20c80 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
20c90 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
20ca0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20cb0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
20cc0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
20cd0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
20ce0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
20cf0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20d00 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
20d10 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
20d20 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20d30 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
20d40 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
20d50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
20d60 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
20d70 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20d80 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
20d90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20da0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20db0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
20dc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
20dd0 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
20de0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
20df0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20e00 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
20e10 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
20e20 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
20e30 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  c;.}.../*.** Ste
20e40 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
20e50 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
20e60 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
20e70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
20e80 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
20e90 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
20ea0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
20eb0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
20ec0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
20ed0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
20ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
20ef0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
20f00 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
20f10 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
20f20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
20f30 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
20f40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
20f50 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
20f60 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
20f70 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
20f80 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20f90 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
20fa0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
20fb0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
20fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
20fe0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
20ff0 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
21000 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
21010 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
21020 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
21030 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
21040 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
21050 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20  f( pCur->skip<0 
21060 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
21070 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
21080 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
21090 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
210a0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
210b0 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
210c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
210d0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
210e0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
210f0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
21100 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
21110 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
21120 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
21130 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
21140 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
21150 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
21160 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
21170 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
21180 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21190 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  }.    rc = moveT
211a0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
211b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
211c0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
211d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
211e0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
211f0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
21200 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
21210 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
21220 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
21230 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
21240 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21250 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
21260 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
21270 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
21280 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
21290 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
212a0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
212b0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20  idNKey = 0;..   
212c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
212d0 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
212e0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
212f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21300 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
21310 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
21320 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
21330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21340 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
21350 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
21360 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
21370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
21380 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
21390 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
213a0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
213b0 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
213c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
213d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
213e0 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
213f0 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
21400 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
21410 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
21420 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
21430 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
21440 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
21450 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
21460 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
21470 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
21480 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
21490 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
214a0 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
214b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
214c0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
214d0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
214e0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
214f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
21500 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
21510 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
21520 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
21530 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
21540 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
21550 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
21560 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
21570 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
21580 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
21590 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
215a0 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
215b0 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
215c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
215d0 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
215e0 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20  s not 0, then a 
215f0 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20  (feeble) effort 
21600 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
21610 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
21620 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
21630 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
21640 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
21650 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
21660 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
21670 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
21680 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
21690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
216a0 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
216b0 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
216c0 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
216d0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
216e0 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65  e "exact" parame
216f0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e  ter is not 0, an
21700 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  d the page-numbe
21710 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20  r nearby exists 
21720 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
21730 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
21740 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e  hen it is guaren
21750 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
21760 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  ned. This.** is 
21770 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74  only used by aut
21780 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
21790 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  es when allocati
217a0 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a  ng a new table..
217b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
217c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
217d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
217e0 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  , .  MemPage **p
217f0 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a  pPage, .  Pgno *
21800 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e  pPgno, .  Pgno n
21810 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63  earby,.  u8 exac
21820 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t.){.  MemPage *
21830 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
21840 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f  ;.  int n;     /
21850 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
21860 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
21870 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20  t */.  int k;   
21880 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
21890 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
218a0 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
218b0 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
218c0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
218d0 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
218e0 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  nk = 0;..  asser
218f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
21900 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
21910 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
21920 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e  pBt->pPage1;.  n
21930 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
21940 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
21950 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
21960 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
21970 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
21980 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
21990 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
219a0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
219b0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
219c0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
219d0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
219e0 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
219f0 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
21a00 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
21a10 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
21a20 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
21a30 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
21a40 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
21a50 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
21a60 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
21a70 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
21a80 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
21a90 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
21aa0 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
21ab0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
21ac0 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
21ad0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
21ae0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21af0 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
21b00 20 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65   && nearby<=page
21b10 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
21b20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
21b30 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
21b40 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
21b50 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
21b60 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
21b70 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
21b80 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
21b90 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
21ba0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
21bb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
21bc0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
21bd0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
21be0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
21bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21c00 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
21c10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
21c20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
21c30 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
21c40 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
21c50 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
21c60 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
21c70 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
21c80 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
21c90 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
21ca0 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
21cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21cc0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
21cd0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
21ce0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
21cf0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
21d00 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
21d10 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
21d20 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
21d30 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
21d40 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
21d50 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
21d60 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
21d70 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
21d80 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
21d90 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
21da0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
21db0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
21dc0 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
21dd0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
21de0 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
21df0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
21e00 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
21e10 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
21e20 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
21e30 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
21e40 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
21e50 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
21e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21e70 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
21e80 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
21e90 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
21ea0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21eb0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
21ec0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
21ed0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nk, 0);.      if
21ee0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
21ef0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
21f00 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
21f10 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
21f20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
21f30 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
21f40 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
21f50 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
21f60 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
21f70 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
21f80 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
21f90 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
21fa0 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
21fb0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
21fc0 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
21fd0 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
21fe0 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
21ff0 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
22000 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
22010 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
22020 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
22030 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
22040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22050 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
22060 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
22070 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
22080 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
22090 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
220a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
220b0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
220c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
220d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
220e0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
220f0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
22100 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
22110 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
22120 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
22130 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
22140 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
22150 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
22160 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
22170 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
22180 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
22190 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
221a0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
221b0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
221c0 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
221d0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
221e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
221f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22200 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
22210 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
22220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22230 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
22240 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
22250 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
22260 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
22270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
22280 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
22290 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
222a0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
222b0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
222c0 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
222d0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
222e0 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
222f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22300 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
22310 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
22320 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
22330 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
22340 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
22350 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22360 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22370 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
22380 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
22390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
223a0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
223b0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
223c0 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
223d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
223e0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
223f0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
22400 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
22410 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
22420 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
22430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22440 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
22450 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
22460 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
22470 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
22480 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
224a0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
224b0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
224c0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
224d0 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
224e0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
224f0 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
22500 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
22510 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
22520 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
22530 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
22540 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
22550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22560 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
22570 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
22580 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
22590 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
225a0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
225b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
225c0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
225d0 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
225e0 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
225f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22610 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
22620 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
22630 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
22640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22650 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
22660 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
22670 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
22680 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
226a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
226b0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
226c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
226d0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
226e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
226f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
22700 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
22710 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
22720 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
22730 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
22740 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
22750 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
22760 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
22770 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
22780 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
22790 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
227a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
227b0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
227c0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
227d0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
227e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
227f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
22800 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
22810 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
22820 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
22830 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
22840 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
22850 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
22860 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22870 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
22880 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
22890 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
228a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
228c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
228d0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
228e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
228f0 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
22900 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
22910 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
22920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22930 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
22940 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
22950 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
22960 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
22970 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
22980 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
22990 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
229a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
229b0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
229c0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
229d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
229e0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
229f0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
22a00 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
22a10 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
22a20 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
22a30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22a40 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
22a50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
22a60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
22a70 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
22a80 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
22a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22aa0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
22ab0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
22ac0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
22ad0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
22ae0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
22af0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
22b00 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
22b10 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
22b20 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
22b30 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
22b40 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
22b50 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
22b60 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
22b70 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
22b80 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
22b90 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
22ba0 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
22bb0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
22bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22bd0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
22be0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
22bf0 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
22c00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
22c10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22c20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
22c30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
22c40 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
22c50 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
22c60 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
22c70 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
22c80 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
22c90 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
22ca0 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
22cb0 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ent;.          P
22cc0 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  gno nPage;.     
22cd0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
22ce0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  age;.          n
22cf0 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
22d00 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
22d10 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
22d20 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
22d30 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61        /* Free pa
22d40 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ge off the end o
22d50 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
22d60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
22d70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22d80 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
22d90 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
22da0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
22db0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52    }.          TR
22dc0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
22dd0 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
22de0 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
22df0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
22e00 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
22e10 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
22e30 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
22e40 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
22e50 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
22e60 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
22e70 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
22e80 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
22e90 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
22ea0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
22eb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22ec0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
22ed0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
22ee0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22ef0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
22f00 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e  swriteable(pTrun
22f10 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  k->pDbPage) );. 
22f20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
22f30 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
22f40 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
22f50 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
22f60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
22f70 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
22f80 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
22f90 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
22fa0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22fb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22fc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22fd0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
22fe0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
22ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23020 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
23030 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
23040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
23050 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
23060 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
23070 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23080 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
23090 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
230a0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
230b0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
230c0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
230d0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
230e0 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
230f0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
23100 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  so create a new 
23110 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20  page at the.    
23120 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
23130 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  le */.    int nP
23140 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
23150 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a  ount(pBt);.    *
23160 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20  pPgno = nPage + 
23170 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67  1;..    if( *pPg
23180 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
23190 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
231a0 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
231b0 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
231c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
231d0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
231e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
231f0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
23200 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
23210 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
23220 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
23230 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
23240 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
23250 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
23260 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
23270 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
23280 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
23290 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
232a0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
232b0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
232c0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
232d0 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
232e0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
232f0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
23300 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
23310 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
23320 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
23330 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
23340 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
23350 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
23360 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
23370 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
23380 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
23390 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
233a0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
233b0 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  gno, &pPg, 0);. 
233c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
233d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
233e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
233f0 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
23400 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23410 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
23420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23430 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
23440 72 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e  rc;.      (*pPgn
23450 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  o)++;.      if( 
23460 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
23470 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
23480 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a  { (*pPgno)++; }.
23490 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
234a0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
234b0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
234c0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
234d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
234e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
234f0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  Pgno, ppPage, 0)
23500 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
23510 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
23520 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23530 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
23540 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
23550 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23560 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
23570 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
23580 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
23590 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
235a0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
235b0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
235c0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
235d0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
235e0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
235f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
23600 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
23610 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
23620 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
23630 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
23640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
23650 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
23660 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
23670 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
23680 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
23690 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
236a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
236b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
236c0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
236d0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
236e0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
236f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23700 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
23710 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
23720 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
23730 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
23740 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
23750 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
23760 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
23770 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
23780 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
23790 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
237a0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
237b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
237c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
237d0 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
237e0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
237f0 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
23800 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
23810 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
23820 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
23830 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
23840 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
23850 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
23860 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
23870 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
23880 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
23890 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
238a0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
238b0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
238c0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
238d0 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
238e0 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
238f0 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
23900 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
23910 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
23920 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
23930 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
23940 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
23950 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
23960 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23970 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
23980 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
23990 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
239a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
239b0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
239c0 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
239d0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
239e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
239f0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
23a00 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
23a10 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
23a20 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
23a30 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a50 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
23a60 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
23a70 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
23aa0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
23ab0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
23ae0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
23af0 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
23b00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
23b10 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
23b20 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
23b30 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
23b40 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
23b50 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
23b60 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
23b70 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
23b80 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
23b90 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
23ba0 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
23bb0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
23bc0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
23bd0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
23be0 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
23bf0 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
23c00 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
23c10 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
23c20 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
23c30 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
23c40 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
23c50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
23c60 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
23c70 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
23c80 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
23c90 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
23ca0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
23cb0 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66  , nFree+1);..#if
23cc0 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
23cd0 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
23ce0 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
23cf0 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
23d00 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
23d10 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
23d20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
23d30 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
23d40 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
23d50 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
23d60 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
23d70 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
23d80 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
23d90 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
23da0 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20  ))).   ||       
23db0 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74       (rc = sqlit
23dc0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
23dd0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20  ge->pDbPage)).  
23de0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
23df0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
23e00 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
23e10 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
23e20 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
23e30 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
23e40 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
23e50 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
23e60 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
23e70 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
23e80 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
23e90 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
23ea0 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
23eb0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
23ec0 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
23ed0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
23ee0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
23ef0 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  EPAGE, 0);.    i
23f00 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
23f10 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
23f20 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
23f30 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
23f40 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
23f50 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
23f60 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
23f70 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
23f80 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
23f90 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
23fa0 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
23fb0 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
23fc0 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
23fd0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
23fe0 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
23ff0 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
24000 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
24010 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
24020 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
24030 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
24040 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
24050 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
24060 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
24070 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
24080 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
24090 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
240a0 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
240b0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
240c0 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
240d0 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ree!=0 ){.    in
240e0 74 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  t nLeaf;        
240f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
24100 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
24110 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
24120 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
24130 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
24140 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
24150 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  2]);.    rc = sq
24160 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
24170 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
24180 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
24190 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
241a0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
241b0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
241c0 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
241d0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
241e0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
241f0 20 20 69 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b    if( nLeaf<0 ){
24200 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
24210 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24220 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
24230 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
24240 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42      if( nLeaf<pB
24250 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
24260 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
24270 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
24280 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
24290 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
242a0 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
242b0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
242c0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
242d0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
242e0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
242f0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
24300 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
24310 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
24320 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
24330 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
24340 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
24350 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
24360 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
24370 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
24380 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
24390 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
243a0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
243b0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
243c0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
243d0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
243e0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
243f0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
24400 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
24410 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
24420 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
24430 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
24440 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
24450 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
24460 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
24470 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
24480 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
24490 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
244a0 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20  will contain to 
244b0 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
244c0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
244d0 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
244e0 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
244f0 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
24500 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
24510 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
24520 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
24530 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
24540 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
24550 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
24560 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
24570 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
24580 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
24590 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
245a0 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
245b0 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
245c0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
245d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
245e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
245f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
24600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24610 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
24620 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
24630 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
24640 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
24650 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
24660 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69  f*4], iPage);.#i
24670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  fndef SQLITE_SEC
24680 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  URE_DELETE.     
24690 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
246a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
246b0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
246c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
246d0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
246e0 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  f.        rc = b
246f0 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
24700 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
24710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
24720 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
24730 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
24740 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
24750 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
24760 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
24770 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
24780 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24790 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
247a0 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
247b0 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
247c0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
247d0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
247e0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
247f0 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
24800 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
24810 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
24820 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
24830 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
24840 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
24850 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
24860 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
24870 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
24880 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
24890 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
248a0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
248b0 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
248c0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
248d0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
248e0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
248f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 20 20 28  ..  */.  if(   (
24900 28 21 70 50 61 67 65 29 20 26 26 20 28 30 20 21  (!pPage) && (0 !
24910 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  = (rc = sqlite3B
24920 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
24930 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
24940 30 29 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30  0)))).     || (0
24950 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
24960 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
24970 65 2d 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20  e->pDbPage))).  
24980 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
24990 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
249a0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
249b0 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
249c0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
249d0 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
249e0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
249f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
24a00 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
24a10 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
24a20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
24a30 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
24a40 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
24a50 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
24a60 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
24a70 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
24a80 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
24a90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
24aa0 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
24ab0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
24ac0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
24ad0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28  ic int freePage(
24ae0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
24af0 0a 20 20 72 65 74 75 72 6e 20 66 72 65 65 50 61  .  return freePa
24b00 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
24b10 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
24b20 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  no);.}../*.** Fr
24b30 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
24b40 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
24b50 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
24b60 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
24b70 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
24b80 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
24b90 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
24ba0 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
24bb0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
24bc0 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
24bd0 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
24be0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
24bf0 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31   int nOvfl;.  u1
24c00 36 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  6 ovflPageSize;.
24c10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24c20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
24c30 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
24c40 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
24c50 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
24c60 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
24c70 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
24c80 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
24c90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24ca0 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
24cb0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
24cc0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
24cd0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
24ce0 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
24cf0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
24d00 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
24d10 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
24d20 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
24d30 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
24d40 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
24d50 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
24d60 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
24d70 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
24d80 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
24d90 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
24da0 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
24db0 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
24dc0 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
24dd0 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
24de0 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
24df0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
24e00 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
24e10 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
24e20 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
24e30 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
24e40 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
24e50 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
24e60 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
24e70 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
24e80 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
24e90 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
24ea0 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
24eb0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
24ec0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
24ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
24ee0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
24ef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
24f00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24f10 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
24f20 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
24f30 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
24f40 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
24f50 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
24f60 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
24f70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
24f80 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72     }.    rc = fr
24f90 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
24fa0 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
24fb0 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
24fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24fd0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
24fe0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
24ff0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
25000 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
25010 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
25020 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25030 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
25040 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
25050 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
25060 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
25070 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
25080 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
25090 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
250a0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
250b0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
250c0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
250d0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
250e0 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
250f0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
25100 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
25110 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
25120 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
25130 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
25140 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
25150 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
25160 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
25170 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
25180 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
25190 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
251a0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
251b0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
251c0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
251d0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
251e0 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
251f0 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
25200 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
25210 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
25220 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
25230 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
25240 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
25250 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
25260 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
25270 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
25280 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
25290 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
252a0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
252b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
252c0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
252d0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
252e0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
252f0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
25300 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
25310 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
25320 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
25330 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
25340 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
25350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
25360 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
25370 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
25380 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
25390 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
253a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
253b0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
253c0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
253d0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
253e0 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
253f0 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
25400 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
25410 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
25420 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
25430 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
25440 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
25450 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
25460 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
25470 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
25480 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
25490 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
254a0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
254b0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
254c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
254d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
254e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
254f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
25500 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
25510 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
25520 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
25530 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
25540 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
25550 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
25560 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
25570 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
25580 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
25590 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
255a0 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
255b0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
255c0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
255d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
255e0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
255f0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
25600 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
25610 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
25620 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
25630 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
25640 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
25650 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
25660 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
25670 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
25680 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
25690 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
256a0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
256b0 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
256c0 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
256d0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
256e0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
256f0 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
25700 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
25710 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
25720 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
25730 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
25740 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
25750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
25760 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
25770 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
25780 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
25790 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
257a0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
257b0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
257c0 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
257d0 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
257e0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
257f0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
25800 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
25810 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
25820 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
25830 66 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  f( nKey>0x7fffff
25840 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b  ff || pKey==0 ){
25850 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25860 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
25870 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
25880 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
25890 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
258a0 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
258b0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
258c0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
258d0 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
258e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
258f0 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
25900 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
25910 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
25920 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
25930 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
25940 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
25950 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
25960 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25970 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
25980 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
25990 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
259a0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
259b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
259c0 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
259d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
259e0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
259f0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
25a00 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
25a10 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
25a20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
25a30 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
25a40 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
25a50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
25a60 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
25a70 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
25a80 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
25a90 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
25aa0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
25ab0 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
25ac0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
25ad0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
25ae0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
25af0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
25b00 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
25b10 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
25b20 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
25b30 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
25b40 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
25b50 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
25b60 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
25b70 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
25b80 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
25b90 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
25ba0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
25bb0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
25bc0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
25bd0 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
25be0 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
25bf0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
25c00 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
25c10 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
25c20 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
25c30 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
25c40 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
25c50 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
25c60 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
25c70 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
25c80 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
25c90 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
25ca0 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
25cb0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
25cc0 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
25cd0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25ce0 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
25cf0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
25d00 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
25d10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25d20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
25d30 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
25d40 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
25d50 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
25d60 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
25d70 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
25d80 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
25d90 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
25da0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
25db0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
25dc0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
25dd0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
25de0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
25df0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
25e00 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
25e10 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25e20 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
25e30 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
25e40 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
25e50 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
25e60 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
25e70 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
25e80 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
25e90 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
25ea0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
25eb0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
25ec0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
25ed0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
25ee0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
25ef0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
25f00 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
25f10 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
25f20 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
25f30 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
25f40 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
25f50 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
25f60 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
25f70 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
25f80 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
25f90 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
25fa0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
25fb0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
25fd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25fe0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
25ff0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
26000 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
26010 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
26020 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26030 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
26040 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
26050 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
26060 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
26070 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
26080 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
26090 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
260a0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
260b0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
260c0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
260d0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
260e0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
260f0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
26100 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
26110 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
26120 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
26130 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
26140 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
26150 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
26160 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
26170 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
26180 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
26190 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
261a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
261b0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
261c0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
261d0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
261e0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
261f0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
26200 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
26210 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
26220 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
26230 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
26240 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
26250 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
26260 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
26270 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
26280 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
26290 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
262a0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
262b0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
262c0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
262d0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
262e0 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
262f0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
26300 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
26310 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
26320 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
26330 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
26340 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
26350 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
26360 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
26370 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
26380 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
26390 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
263a0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
263b0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
263c0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
263d0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
263e0 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
263f0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
26400 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
26410 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
26420 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
26430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26440 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
26450 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
26460 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
26470 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
26480 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
26490 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
264a0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
264b0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
264c0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
264d0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
264e0 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
264f0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
26500 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
26510 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
26520 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
26530 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
26540 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
26550 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
26560 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
26570 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
26580 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43  static int dropC
26590 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
265a0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
265b0 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
265c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
265d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
265e0 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
265f0 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
26600 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
26610 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
26620 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
26630 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
26640 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
26650 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
26660 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
26670 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
26680 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
26690 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
266a0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
266b0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
266c0 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
266d0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
266e0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
266f0 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
26700 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
26710 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
26720 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
26730 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26740 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
26750 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
26760 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
26770 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
26780 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
26790 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
267a0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
267b0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28  byte(ptr);.  if(
267c0 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f   (pc<pPage->hdrO
267d0 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
267e0 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20  leaf?0:4)).     
267f0 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d  || (pc+sz>pPage-
26800 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
26810 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
26820 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
26830 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
26840 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
26850 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
26860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26870 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
26880 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b    }.  for(i=idx+
26890 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
268a0 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
268b0 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
268c0 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
268d0 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
268e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
268f0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
26900 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
26910 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
26920 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
26930 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74  Free += 2;.  ret
26940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26950 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
26960 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
26970 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
26980 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
26990 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
269a0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
269b0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
269c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
269d0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
269e0 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
269f0 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
26a00 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
26a10 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
26a20 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
26a30 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
26a40 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
26a50 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
26a60 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
26a70 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
26a80 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
26a90 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
26aa0 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
26ab0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
26ac0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
26ad0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
26ae0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
26af0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
26b00 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
26b10 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
26b20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
26b30 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
26b40 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
26b50 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
26b60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
26b70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
26b80 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
26b90 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
26ba0 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
26bb0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
26bc0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
26bd0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
26be0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
26bf0 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
26c00 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
26c10 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
26c20 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
26c30 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
26c40 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
26c50 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
26c60 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
26c70 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
26c80 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
26c90 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
26ca0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
26cb0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
26cc0 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
26cd0 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
26ce0 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
26cf0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
26d00 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
26d10 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
26d20 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
26d30 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
26d40 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
26d50 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
26d60 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
26d70 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
26d80 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
26d90 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
26da0 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b  eded */.  u8 nSk
26db0 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ip          /* D
26dc0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  o not write the 
26dd0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
26de0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  s of the cell */
26df0 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20  .){.  int idx;  
26e00 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
26e10 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
26e20 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
26e30 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
26e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26e50 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
26e60 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
26e70 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
26e80 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   of content for 
26e90 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61  any cell in data
26ea0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  [] */.  int end;
26eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
26ec0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
26ed0 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
26ee0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
26ef0 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
26f00 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
26f10 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
26f20 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
26f30 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
26f40 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
26f50 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
26f60 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61  data[] of the pa
26f70 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
26f80 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
26f90 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
26fa0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
26fb0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
26fc0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
26fd0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
26fe0 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
26ff0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
27000 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
27010 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
27020 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
27030 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
27040 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
27050 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
27060 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
27070 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
27080 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
27090 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
270a0 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
270b0 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
270c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
270d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
270e0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f  aySize(pPage->aO
270f0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
27100 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
27110 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
27120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27130 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27140 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
27150 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
27160 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
27170 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
27180 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
27190 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
271a0 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
271b0 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
271c0 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
271d0 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
271e0 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
271f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
27200 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
27210 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
27220 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
27230 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Page->aOvfl[0]))
27240 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
27250 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
27260 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
27270 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
27280 20 28 75 31 36 29 69 3b 0a 20 20 20 20 70 50 61   (u16)i;.    pPa
27290 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ge->nFree = 0;. 
272a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
272b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
272c0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
272d0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
272e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
272f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
27300 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
27310 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
27320 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
27330 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
27340 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
27350 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20  >aData;.    hdr 
27360 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
27370 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  et;.    top = ge
27380 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
27390 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  +5]);.    cellOf
273a0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
273b0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
273c0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
273d0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   2*pPage->nCell 
273e0 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  + 2;.    ins = c
273f0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
27400 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74  .    if( end > t
27410 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20  op - sz ){.     
27420 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
27430 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
27440 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27450 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27460 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
27470 20 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67   }.      top = g
27480 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
27490 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
274a0 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
274b0 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
274c0 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
274d0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
274e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
274f0 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
27500 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
27510 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
27520 20 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b   );.    if (idx+
27530 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
27540 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20  >usableSize) {. 
27550 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27560 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27570 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
27580 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
27590 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
275a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
275b0 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
275c0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
275d0 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Skip);.    for(j
275e0 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74  =end-2, ptr=&dat
275f0 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
27600 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
27610 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
27620 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
27630 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
27640 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
27650 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
27660 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
27670 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
27680 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  e->nCell);.#ifnd
27690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
276a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
276b0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
276c0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
276d0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
276e0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
276f0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
27700 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
27710 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
27720 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
27730 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
27740 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
27750 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
27760 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
27770 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
27780 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
27790 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
277a0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73  &info);.      as
277b0 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
277c0 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
277d0 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
277e0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
277f0 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e  .      if( info.
27800 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
27810 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76       Pgno pgnoOv
27820 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
27830 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
27840 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  low]);.        r
27850 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50  c = ptrmapPut(pP
27860 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76  age->pBt, pgnoOv
27870 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
27880 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
27890 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
278a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
278b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
278c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
278d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
278e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
278f0 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
27900 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
27910 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
27920 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
27930 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
27940 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
27950 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
27960 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
27970 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
27980 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
27990 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
279a0 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
279b0 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
279c0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
279d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
279e0 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
279f0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
27a00 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
27a10 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
27a20 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
27a30 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
27a40 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
27a50 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
27a60 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
27a70 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
27a80 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
27a90 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
27aa0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
27ab0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
27ac0 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
27ad0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
27ae0 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
27af0 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
27b00 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
27b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
27b20 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
27b30 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
27b40 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
27b50 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
27b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
27b70 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
27b80 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
27b90 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
27ba0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
27bb0 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
27bc0 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
27bd0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
27be0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
27bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27c00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27c10 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
27c20 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
27c30 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
27c40 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
27c50 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
27c60 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35  L(pPage->pBt)<=5
27c70 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  460 );.  assert(
27c80 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
27c90 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
27ca0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
27cb0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
27cc0 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
27cd0 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
27ce0 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
27cf0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
27d00 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
27d10 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74  t( get2byte(&dat
27d20 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62  a[hdr+5])==nUsab
27d30 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74  le );..  pCellpt
27d40 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
27d50 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43  >cellOffset + nC
27d60 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f  ell*2];.  cellbo
27d70 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20  dy = nUsable;.  
27d80 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69  for(i=nCell-1; i
27d90 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
27da0 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
27db0 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53    cellbody -= aS
27dc0 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32  ize[i];.    put2
27dd0 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63  byte(pCellptr, c
27de0 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65  ellbody);.    me
27df0 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
27e00 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
27e10 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a   aSize[i]);.  }.
27e20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
27e30 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
27e40 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
27e50 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f  a[hdr+5], cellbo
27e60 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  dy);.  pPage->nF
27e70 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20  ree -= (nCell*2 
27e80 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c  + nUsable - cell
27e90 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
27ea0 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65  nCell = (u16)nCe
27eb0 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
27ec0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
27ed0 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
27ee0 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
27ef0 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
27f00 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
27f10 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
27f20 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
27f30 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
27f40 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
27f50 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
27f60 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
27f70 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
27f80 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
27f90 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
27fa0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
27fb0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
27fc0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
27fd0 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
27fe0 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
27ff0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
28000 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
28010 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
28020 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
28030 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
28040 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
28050 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
28060 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
28070 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
28080 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
28090 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
280a0 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
280b0 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
280c0 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
280d0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
280e0 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
280f0 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
28100 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
28110 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
28120 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
28130 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28140 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
28150 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
28160 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
28170 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
28180 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
28190 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
281a0 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f  alance */../* Fo
281b0 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
281c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
281d0 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 2a 2c  lance(BtCursor*,
281e0 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20   int);..#ifndef 
281f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
28200 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
28210 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
28220 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
28230 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
28240 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
28250 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
28260 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
28270 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
28280 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
28290 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
282a0 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
282b0 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
282c0 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
282d0 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
282e0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
282f0 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
28300 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  g balance the 3 
28310 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
28320 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
28330 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
28340 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
28350 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
28360 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
28370 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
28380 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
28390 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
283a0 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
283b0 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
283c0 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
283d0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
283e0 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
283f0 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
28400 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
28410 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
28420 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
28430 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
28440 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
28450 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
28460 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
28470 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
28480 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
28490 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
284a0 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
284b0 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
284c0 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
284d0 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
284e0 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
284f0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
28500 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
28510 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
28520 6e 63 65 5f 71 75 69 63 6b 28 42 74 43 75 72 73  nce_quick(BtCurs
28530 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
28540 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
28550 70 4e 65 77 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  pNew = 0;.  Pgno
28560 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a   pgnoNew;.  u8 *
28570 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43  pCell;.  u16 szC
28580 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ell;.  CellInfo 
28590 69 6e 66 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20  info;.  MemPage 
285a0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
285b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
285c0 65 5d 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e];.  MemPage *p
285d0 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
285e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
285f0 65 2d 31 5d 3b 0a 20 20 42 74 53 68 61 72 65 64  e-1];.  BtShared
28600 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
28610 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74  Bt;.  int parent
28620 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Idx = pParent->n
28630 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65  Cell;   /* pPare
28640 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  nt new divider c
28650 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
28660 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20  nt parentSize;  
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28680 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20   /* Size of new 
28690 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
286a0 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b    u8 parentCell[
286b0 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  64];            
286c0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
286d0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
286e0 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   cell */..  asse
286f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
28700 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
28710 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
28720 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
28730 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74  w page. Insert t
28740 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
28750 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a   from pPage.  **
28760 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72   into it. Then r
28770 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c  emove the overfl
28780 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
28790 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ge..  */.  rc = 
287a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
287b0 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
287c0 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  gnoNew, 0, 0);. 
287d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
287e0 4f 4b 20 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  OK ){.    pCell 
287f0 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
28800 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 73 7a 43  ].pCell;.    szC
28810 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
28820 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
28830 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
28840 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
28850 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
28860 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  ge) );.    zeroP
28870 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d  age(pNew, pPage-
28880 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
28890 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
288a0 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
288b0 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  zCell);.    pPag
288c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
288d0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 70 50 61 67  ;.  .    /* pPag
288e0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  e is currently t
288f0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
28900 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67  f pParent. Chang
28910 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 6f  e this.    ** so
28920 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
28930 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77  child is the new
28940 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   page allocated 
28950 61 62 6f 76 65 20 61 6e 64 0a 20 20 20 20 2a 2a  above and.    **
28960 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e 65   pPage is the ne
28970 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c  xt-to-right chil
28980 64 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  d. .    **.    *
28990 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72 65 74  * Ignore the ret
289a0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  urn value of the
289b0 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e 43   call to fillInC
289c0 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43 65 6c  ell(). fillInCel
289d0 6c 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6f  l().    ** may o
289e0 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68 65 72  nly return other
289f0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
28a00 69 66 20 69 74 20 69 73 20 72 65 71 75 69 72 65  if it is require
28a10 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  d to allocate.  
28a20 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    ** one or more
28a30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
28a40 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e   Since an intern
28a50 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65 65 20  al table B-Tree 
28a60 63 65 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d 61 79  cell .    ** may
28a70 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f 76 65   never spill ove
28a80 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72 66 6c  r onto an overfl
28a90 6f 77 20 70 61 67 65 20 28 69 74 20 69 73 20 61  ow page (it is a
28aa0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20 20 20   maximum of .   
28ab0 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69 6e 20   ** 13 bytes in 
28ac0 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e 6f 74  size), it is not
28ad0 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f 20 63   neccessary to c
28ae0 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
28af0 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  code..    **.   
28b00 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74   ** Similarly, t
28b10 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  he insertCell() 
28b20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
28b30 66 61 69 6c 20 69 66 20 74 68 65 20 70 61 67 65  fail if the page
28b40 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e  .    ** being in
28b50 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73 20 61  serted into is a
28b60 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c 65 20  lready writable 
28b70 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64 6f 65  and the cell doe
28b80 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 63 6f  s not .    ** co
28b90 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66 6c 6f  ntain an overflo
28ba0 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20 69 67  w pointer. So ig
28bb0 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75 72 6e  nore this return
28bc0 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 20 20 2a   code too..    *
28bd0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
28be0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
28bf0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
28c00 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
28c10 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
28c20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
28c30 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
28c40 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
28c50 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70      fillInCell(p
28c60 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65  Parent, parentCe
28c70 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
28c80 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65  , 0, 0, 0, &pare
28c90 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73  ntSize);.    ass
28ca0 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c  ert( parentSize<
28cb0 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  64 );.    assert
28cc0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
28cd0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
28ce0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
28cf0 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
28d00 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78  arent, parentIdx
28d10 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61  , parentCell, pa
28d20 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b  rentSize, 0, 4);
28d30 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69  .    put4byte(fi
28d40 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
28d50 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78  Parent,parentIdx
28d60 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ), pPage->pgno);
28d70 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
28d80 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
28d90 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
28da0 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20  +8], pgnoNew);. 
28db0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
28dc0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
28dd0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
28de0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
28df0 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  map.    ** with 
28e00 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
28e10 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
28e20 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
28e30 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  he .    ** cell 
28e40 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
28e50 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
28e60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28e70 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
28e80 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
28e90 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
28ea0 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
28eb0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
28ec0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28ed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28ee0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
28ef0 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b  utOvfl(pNew, 0);
28f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
28f10 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
28f20 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
28f30 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
28f40 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
28f50 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pNew);.  }..  /
28f60 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
28f70 74 68 65 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  the pPage->nFree
28f80 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74   variable is not
28f90 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 20 77   set correctly w
28fa0 69 74 68 0a 20 20 2a 2a 20 72 65 73 70 65 63 74  ith.  ** respect
28fb0 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   to the content 
28fc0 6f 66 20 74 68 65 20 70 61 67 65 20 28 62 65 63  of the page (bec
28fd0 61 75 73 65 20 69 74 20 77 61 73 20 73 65 74 20  ause it was set 
28fe0 74 6f 20 30 20 62 79 20 0a 20 20 2a 2a 20 69 6e  to 0 by .  ** in
28ff0 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f 20 63 61  sertCell). So ca
29000 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  ll sqlite3BtreeI
29010 6e 69 74 50 61 67 65 28 29 20 74 6f 20 6d 61 6b  nitPage() to mak
29020 65 20 73 75 72 65 20 69 74 20 69 73 0a 20 20 2a  e sure it is.  *
29030 2a 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 0a  * correct..  **.
29040 20 20 2a 2a 20 54 68 69 73 20 68 61 73 20 74 6f    ** This has to
29050 20 62 65 20 64 6f 6e 65 20 65 76 65 6e 20 69 66   be done even if
29060 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c 20 62   an error will b
29070 65 20 72 65 74 75 72 6e 65 64 2e 20 4e 6f 72 6d  e returned. Norm
29080 61 6c 6c 79 2c 20 69 66 0a 20 20 2a 2a 20 61 6e  ally, if.  ** an
29090 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
290a0 72 69 6e 67 20 74 72 65 65 20 62 61 6c 61 6e 63  ring tree balanc
290b0 69 6e 67 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ing, the content
290c0 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65  s of MemPage are
290d0 0a 20 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72 74  .  ** not import
290e0 61 6e 74 2c 20 61 73 20 74 68 65 79 20 77 69 6c  ant, as they wil
290f0 6c 20 62 65 20 72 65 63 61 6c 63 75 6c 61 74 65  l be recalculate
29100 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  d when the page 
29110 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
29120 61 63 6b 2e 20 42 75 74 20 68 65 72 65 2c 20 69  ack. But here, i
29130 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  n balance_quick(
29140 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  ), it is possibl
29150 65 20 74 68 61 74 20 70 50 61 67 65 20 68 61 73  e that pPage has
29160 20 0a 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62   .  ** not yet b
29170 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72 74 79  een marked dirty
29180 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   or written into
29190 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
291a0 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20 20 2a  e. Therefore.  *
291b0 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  * it will not be
291c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
291d0 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f 72 74   so it is import
291e0 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ant to make sure
291f0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 70   that.  ** the p
29200 61 67 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e  age data and con
29210 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67 65  tents of MemPage
29220 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 2e   are consistent.
29230 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 69  .  */.  pPage->i
29240 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c  sInit = 0;.  sql
29250 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
29260 65 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65  e(pPage);.  asse
29270 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
29280 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  flow==0 );..  /*
29290 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 65   If everything e
292a0 6c 73 65 20 73 75 63 63 65 65 64 65 64 2c 20 62  lse succeeded, b
292b0 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
292c0 74 20 70 61 67 65 2c 20 69 6e 20 0a 20 20 2a 2a  t page, in .  **
292d0 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65   case the divide
292e0 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  r cell inserted 
292f0 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63  caused it to bec
29300 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20  ome overfull..  
29310 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
29320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
29330 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
29340 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  ;.    pCur->iPag
29350 65 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20 62 61  e--;.    rc = ba
29360 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a  lance(pCur, 0);.
29370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29380 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
29390 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
293a0 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  LANCE */../*.** 
293b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
293c0 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73  istributes Cells
293d0 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70   on pPage and up
293e0 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67   to NN*2 sibling
293f0 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f  s.** of pPage so
29400 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
29410 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73  have about the s
29420 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
29430 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75  ee space..** Usu
29440 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73  ally NN siblings
29450 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
29460 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64  of pPage is used
29470 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
29480 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72  g,.** though mor
29490 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  e siblings might
294a0 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73   come from one s
294b0 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20  ide if pPage is 
294c0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20  the first.** or 
294d0 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74  last child of it
294e0 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50  s parent.  If pP
294f0 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68  age has fewer th
29500 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73  an 2*NN siblings
29510 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  .** (something w
29520 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
29530 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73  ppen if pPage is
29540 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
29550 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66  r a .** child of
29560 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20   root) then all 
29570 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
29580 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69  gs participate i
29590 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
295a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
295b0 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
295c0 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20   pPage might be 
295d0 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
295e0 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72  reased by one or
295f0 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66  .** two in an ef
29600 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67  fort to keep pag
29610 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62  es nearly full b
29620 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c  ut not over full
29630 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  . The root page.
29640 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e  ** is special an
29650 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  d is allowed to 
29660 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
29670 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a   If pPage is .**
29680 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20   the root page, 
29690 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f  then the depth o
296a0 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74  f the tree might
296b0 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a   be increased.**
296c0 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
296d0 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61   one, as necessa
296e0 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20  ry, to keep the 
296f0 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62  root page from b
29700 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  eing.** overfull
29710 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   or completely e
29720 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  mpty..**.** Note
29730 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
29740 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
29750 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43  d, some of the C
29760 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a  ells on pPage.**
29770 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
29780 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  lly be stored in
29790 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
297a0 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
297b0 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65  n.** if the page
297c0 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50   is overfull.  P
297d0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f  art of the job o
297e0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
297f0 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72  s to.** make sur
29800 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20  e all Cells for 
29810 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e  pPage once again
29820 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61   fit in pPage->a
29830 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e  Data[]..**.** In
29840 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
29850 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62  alancing the sib
29860 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20  lings of pPage, 
29870 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  the parent of pP
29880 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63  age.** might bec
29890 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
298a0 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74  underfull.  If t
298b0 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65  hat happens, the
298c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
298d0 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  * is called recu
298e0 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70  rsively on the p
298f0 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arent..**.** If 
29900 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
29910 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
29920 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
29930 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
29940 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
29950 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74   state.  So if t
29960 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
29970 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
29980 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
29990 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
299a0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
299b0 6e 6f 6e 72 6f 6f 74 28 42 74 43 75 72 73 6f 72  nonroot(BtCursor
299c0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
299d0 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
299e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
299f0 76 65 72 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ver or underfull
29a00 20 70 61 67 65 20 74 6f 20 62 61 6c 61 6e 63 65   page to balance
29a10 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
29a20 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
29a30 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
29a40 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42   of pPage */.  B
29a50 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
29a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29a70 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
29a80 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
29a90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29aa0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29ab0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
29ac0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
29ad0 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
29ae0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
29af0 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
29b00 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
29b10 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 20 3d   */.  int nOld =
29b20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29b30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29b40 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
29b50 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
29b60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29b70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29b80 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
29b90 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20   */.  int nDiv; 
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29bc0 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d  cells in apDiv[]
29bd0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
29be0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
29bf0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29c00 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ers */.  int idx
29c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29c20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
29c30 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65  f pPage in pPare
29c40 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
29c50 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29c70 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
29c80 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
29c90 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
29ca0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
29cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29cc0 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
29cd0 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74   int leafCorrect
29ce0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
29cf0 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
29d00 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
29d10 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
29d20 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
29d30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
29d40 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
29d50 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
29d60 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
29d70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
29d80 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
29d90 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
29da0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
29db0 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
29dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
29dd0 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
29de0 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
29df0 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
29e00 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
29e10 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
29e20 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
29e30 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
29e40 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
29e50 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
29e60 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
29e70 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  e1[] */.  int iS
29e80 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20  pace2 = 0;      
29e90 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
29ea0 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
29eb0 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e  Space2[] */.  in
29ec0 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
29ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
29ee0 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
29ef0 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
29f00 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
29f10 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
29f20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
29f30 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
29f40 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f   */.  Pgno pgnoO
29f50 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
29f60 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
29f70 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
29f80 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
29f90 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
29fa0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
29fb0 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
29fc0 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
29fd0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
29fe0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
29ff0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
2a000 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
2a010 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
2a020 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
2a030 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2a040 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2a050 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
2a060 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  e in apNew[] */.
2a070 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b    u8 *apDiv[NB];
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a090 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
2a0a0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
2a0b0 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
2a0c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a0d0 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
2a0e0 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
2a0f0 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
2a100 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
2a110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2a120 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
2a130 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
2a140 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
2a150 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
2a160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2a170 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
2a180 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
2a190 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
2a1a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
2a1b0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2a1c0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
2a1d0 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42  /.  u8 *aCopy[NB
2a1e0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  ];         /* Sp
2a1f0 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
2a200 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d  data of apCopy[]
2a210 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
2a220 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
2a230 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
2a240 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
2a250 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e 63  ls before balanc
2a260 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  e */.  u8 *aSpac
2a270 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  e2 = 0;       /*
2a280 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65 72 66   Space for overf
2a290 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63 65 6c  low dividers cel
2a2a0 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 65  ls after balance
2a2b0 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20   */.  u8 *aFrom 
2a2c0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
2a2d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a2e0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2a2f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2a300 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2a310 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2a320 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
2a330 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
2a340 31 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  1 );..  /* .  **
2a350 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   Find the parent
2a360 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
2a370 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2a380 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
2a390 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2a3a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a3b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2a3c0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2a3d0 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  ge) || pPage->nO
2a3e0 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
2a3f0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2a400 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 43  ;.  pParent = pC
2a410 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a420 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73  >iPage-1];.  ass
2a430 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a  ert( pParent );.
2a440 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
2a450 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
2a460 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74  gerWrite(pParent
2a470 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20  ->pDbPage)) ){. 
2a480 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2a490 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
2a4a0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2a4b0 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
2a4c0 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
2a4d0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
2a4e0 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69  ent->pgno));..#i
2a4f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a500 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
2a510 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69   /*.  ** A speci
2a520 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e  al case:  If a n
2a530 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73  ew entry has jus
2a540 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  t been inserted 
2a550 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c  into a.  ** tabl
2a560 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62 74  e (that is, a bt
2a570 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65 72  ree with integer
2a580 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61   keys and all da
2a590 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65 73  ta at the leaves
2a5a0 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ).  ** and the n
2a5b0 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  ew entry is the 
2a5c0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2a5d0 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69 74   in the tree (it
2a5e0 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61   has the.  ** la
2a5f0 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20  rgest key) then 
2a600 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  use the special 
2a610 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
2a620 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a  routine for.  **
2a630 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c   balancing.  bal
2a640 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
2a650 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64 20  much faster and 
2a660 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67  results in a tig
2a670 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e  hter.  ** packin
2a680 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  g of data in the
2a690 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
2a6a0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
2a6b0 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70 50  leaf &&.      pP
2a6c0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20  age->intKey &&. 
2a6d0 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
2a6e0 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20  rflow==1 &&.    
2a6f0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30    pPage->aOvfl[0
2a700 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
2a710 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61  ell &&.      pPa
2a720 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
2a730 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
2a740 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2a750 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2a760 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
2a770 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  gno.  ){.    ass
2a780 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2a790 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20  ey );.    /*.   
2a7a0 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   ** TODO: Check 
2a7b0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20  the siblings to 
2a7c0 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67  the left of pPag
2a7d0 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61  e. It may be tha
2a7e0 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72  t.    ** they ar
2a7f0 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e  e not full and n
2a800 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65  o new page is re
2a810 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
2a820 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63     return balanc
2a830 65 5f 71 75 69 63 6b 28 70 43 75 72 29 3b 0a 20  e_quick(pCur);. 
2a840 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2a850 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2a860 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a870 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2a880 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ge)) ){.    goto
2a890 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2a8a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
2a8b0 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69   Find the cell i
2a8c0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
2a8d0 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69  e whose left chi
2a8e0 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20  ld points back. 
2a8f0 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54   ** to pPage.  T
2a900 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62 6c  he "idx" variabl
2a910 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  e is the index o
2a920 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66  f that cell.  If
2a930 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74   pPage.  ** is t
2a940 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69  he rightmost chi
2a950 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68  ld of pParent th
2a960 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70 50  en set idx to pP
2a970 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20  arent->nCell .  
2a980 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d  */.  idx = pCur-
2a990 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2a9a0 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 50  ge-1];.  assertP
2a9b0 61 72 65 6e 74 49 6e 64 65 78 28 70 50 61 72 65  arentIndex(pPare
2a9c0 6e 74 2c 20 69 64 78 2c 20 70 50 61 67 65 2d 3e  nt, idx, pPage->
2a9d0 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  pgno);..  /*.  *
2a9e0 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70  * Find sibling p
2a9f0 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e  ages to pPage an
2aa00 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  d the cells in p
2aa10 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69  Parent that divi
2aa20 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c  de.  ** the sibl
2aa30 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70  ings.  An attemp
2aa40 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
2aa50 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
2aa60 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64   either.  ** sid
2aa70 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72  e of pPage.  Mor
2aa80 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
2aa90 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
2aaa0 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a  de, however, if.
2aab0 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65    ** pPage there
2aac0 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
2aad0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
2aae0 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20  he other side.  
2aaf0 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
2ab00 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
2ab10 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
2ab20 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
2ab30 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
2ab40 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20  .  */.  nxDiv = 
2ab50 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20  idx - NN;.  if( 
2ab60 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61  nxDiv + NB > pPa
2ab70 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2ab80 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65     nxDiv = pPare
2ab90 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b  nt->nCell - NB +
2aba0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78   1;.  }.  if( nx
2abb0 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44  Div<0 ){.    nxD
2abc0 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44  iv = 0;.  }.  nD
2abd0 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  iv = 0;.  for(i=
2abe0 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42  0, k=nxDiv; i<NB
2abf0 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20  ; i++, k++){.   
2ac00 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e   if( k<pParent->
2ac10 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61  nCell ){.      a
2ac20 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
2ac30 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a  ll(pParent, k);.
2ac40 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20        nDiv++;.  
2ac50 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2ac60 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  rent->leaf );.  
2ac70 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
2ac80 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
2ac90 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
2aca0 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  f( k==pParent->n
2acb0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67  Cell ){.      pg
2acc0 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
2acd0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2ace0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2acf0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2ad00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
2ad10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
2ad20 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2ad30 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69  e(pBt, pgnoOld[i
2ad40 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  ], &apOld[i]);. 
2ad50 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2ad60 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2ad70 3b 0a 20 20 20 20 2f 2a 20 61 70 4f 6c 64 5b 69  ;.    /* apOld[i
2ad80 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b  ]->idxParent = k
2ad90 3b 20 2a 2f 0a 20 20 20 20 61 70 43 6f 70 79 5b  ; */.    apCopy[
2ada0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  i] = 0;.    asse
2adb0 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20  rt( i==nOld );. 
2adc0 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e     nOld++;.    n
2add0 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
2ade0 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
2adf0 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
2ae00 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  w;.  }..  /* Mak
2ae10 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
2ae20 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
2ae30 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
2ae40 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
2ae50 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
2ae60 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
2ae70 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
2ae80 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
2ae90 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
2aea0 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
2aeb0 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20  .  szScratch =. 
2aec0 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
2aed0 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aef0 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
2af00 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
2af10 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20  sizeof(u16)     
2af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af30 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
2af40 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69      + (ROUND8(si
2af50 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70  zeof(MemPage))+p
2af60 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42  Bt->pageSize)*NB
2af70 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20    /* aCopy */.  
2af80 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
2af90 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afb0 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
2afc0 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43      + (ISAUTOVAC
2afd0 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20  UUM ? nMaxCells 
2afe0 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  : 0);           
2aff0 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20    /* aFrom */.  
2b000 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
2b010 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73  ScratchMalloc( s
2b020 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69  zScratch ); .  i
2b030 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
2b040 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b050 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
2b060 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2b070 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
2b080 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (u16*)&apCell[nM
2b090 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70  axCells];.  aCop
2b0a0 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43  y[0] = (u8*)&szC
2b0b0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
2b0c0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2b0d0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61  BYTE_ALIGNMENT(a
2b0e0 43 6f 70 79 5b 30 5d 29 20 29 3b 0a 20 20 66 6f  Copy[0]) );.  fo
2b0f0 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b  r(i=1; i<NB; i++
2b100 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20  ){.    aCopy[i] 
2b110 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42  = &aCopy[i-1][pB
2b120 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
2b130 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
2b140 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e))];.    assert
2b150 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28  ( ((aCopy[i] - (
2b160 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20 29  u8*)0) & 7)==0 )
2b170 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
2b180 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
2b190 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 31 20  /.  }.  aSpace1 
2b1a0 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70  = &aCopy[NB-1][p
2b1b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
2b1c0 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
2b1d0 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge))];.  assert(
2b1e0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2b1f0 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29  NMENT(aSpace1) )
2b200 3b 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  ;.  if( ISAUTOVA
2b210 43 55 55 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f  CUUM ){.    aFro
2b220 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74  m = &aSpace1[pBt
2b230 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d  ->pageSize];.  }
2b240 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73 71 6c  .  aSpace2 = sql
2b250 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
2b260 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
2b270 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d 30 20   if( aSpace2==0 
2b280 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2b290 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
2b2a0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2b2b0 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a  up;.  }.  .  /*.
2b2c0 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73    ** Make copies
2b2d0 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
2b2e0 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74 73  of pPage and its
2b2f0 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61   siblings into a
2b300 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20  Old[]..  ** The 
2b310 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e  rest of this fun
2b320 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64  ction will use d
2b330 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70  ata from the cop
2b340 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20  ies rather.  ** 
2b350 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
2b360 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
2b370 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
2b380 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
2b390 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
2b3a0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
2b3b0 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  n..  */.  for(i=
2b3c0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
2b3d0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20  .    MemPage *p 
2b3e0 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d  = apCopy[i] = (M
2b3f0 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d  emPage*)aCopy[i]
2b400 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ;.    memcpy(p, 
2b410 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66  apOld[i], sizeof
2b420 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
2b430 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  p->aData = (void
2b440 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  *)&p[1];.    mem
2b450 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70  cpy(p->aData, ap
2b460 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
2b470 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
2b480 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f   }..  /*.  ** Lo
2b490 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
2b4a0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
2b4b0 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
2b4c0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
2b4d0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
2b4e0 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
2b4f0 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
2b500 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
2b510 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
2b520 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
2b530 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  orm aSpace1[] an
2b540 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65  d remove the the
2b550 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20   divider Cells. 
2b560 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
2b570 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
2b580 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
2b590 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
2b5a0 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
2b5b0 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
2b5c0 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
2b5d0 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
2b5e0 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
2b5f0 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
2b600 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
2b610 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
2b620 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
2b630 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
2b640 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
2b650 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
2b660 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
2b670 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
2b680 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
2b690 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
2b6a0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
2b6b0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
2b6c0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2b6d0 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
2b6e0 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
2b6f0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
2b700 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
2b710 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
2b720 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
2b730 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
2b740 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
2b750 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
2b760 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
2b770 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
2b780 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a  */.  nCell = 0;.
2b790 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
2b7a0 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34   = pPage->leaf*4
2b7b0 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70  ;.  leafData = p
2b7c0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20  Page->hasData;. 
2b7d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
2b7e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
2b7f0 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
2b800 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c  py[i];.    int l
2b810 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
2b820 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
2b830 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
2b840 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
2b850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2b860 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2b870 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2b880 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
2b890 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
2b8a0 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2b8b0 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
2b8c0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
2b8d0 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
2b8e0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2b8f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2b900 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d  a;.        aFrom
2b910 5b 6e 43 65 6c 6c 5d 20 3d 20 28 75 38 29 69 3b  [nCell] = (u8)i;
2b920 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
2b930 26 26 20 69 3c 36 20 29 3b 0a 20 20 20 20 20 20  && i<6 );.      
2b940 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c    for(a=0; a<pOl
2b950 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b  d->nOverflow; a+
2b960 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2b970 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d  ( pOld->aOvfl[a]
2b980 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e  .pCell==apCell[n
2b990 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  Cell] ){.       
2b9a0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
2b9b0 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
2b9c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b9d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b9e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2b9f0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
2ba00 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
2ba10 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   ){.      u16 sz
2ba20 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2ba30 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
2ba40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  );.      if( lea
2ba50 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
2ba60 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41   /* With the LEA
2ba70 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72  FDATA flag, pPar
2ba80 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f  ent cells hold o
2ba90 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74  nly INTKEYs that
2baa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
2bab0 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65  duplicates of ke
2bac0 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20  ys on the child 
2bad0 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20  pages.  We need 
2bae0 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20  to remove.      
2baf0 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72    ** the divider
2bb00 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72   cells from pPar
2bb10 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76  ent, but the div
2bb20 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20  iders cells are 
2bb30 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
2bb40 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d  dded to apCell[]
2bb50 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72   because they ar
2bb60 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
2bb70 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20  child cells..   
2bb80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2bb90 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
2bba0 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
2bbb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bbc0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
2bbd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2bbe0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2bbf0 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
2bc00 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
2bc10 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
2bc20 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a  pace1[iSpace1];.
2bc30 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31 20          iSpace1 
2bc40 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
2bc50 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
2bc60 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
2bc70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
2bc80 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65  pace1<=pBt->page
2bc90 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
2bca0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
2bcb0 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
2bcc0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
2bcd0 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
2bce0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2bcf0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2bd00 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UUM ){.         
2bd10 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
2bd20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a  0xFF;.        }.
2bd30 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
2bd40 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2bd50 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 73   sz);.        as
2bd60 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
2bd70 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
2bd80 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
2bd90 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2bda0 43 65 6c 6c 5d 20 2d 3d 20 28 75 31 36 29 6c 65  Cell] -= (u16)le
2bdb0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2bdc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65        assert( ge
2bdd0 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70  t4byte(pTemp)==p
2bde0 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20  gnoOld[i] );.   
2bdf0 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e       if( !pOld->
2be00 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2be10 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2be20 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
2be30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2be40 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66  right pointer of
2be50 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
2be60 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65  pOld becomes the
2be70 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20   left.          
2be80 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ** pointer of th
2be90 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  e divider cell *
2bea0 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
2beb0 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
2bec0 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70  , &pOld->aData[p
2bed0 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  Old->hdrOffset+8
2bee0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], 4);.        }
2bef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2bf00 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
2bf10 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
2bf20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
2bf30 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20  l[nCell]<4 ){.  
2bf40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2bf50 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
2bf60 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
2bf70 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
2bf80 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
2bf90 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
2bfa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bfb0 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  }.        nCell+
2bfc0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
2bfd0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2bfe0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
2bff0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
2c000 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
2c010 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
2c020 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
2c030 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
2c040 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
2c050 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2c060 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
2c070 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
2c080 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
2c090 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
2c0a0 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
2c0b0 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
2c0c0 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
2c0d0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
2c0e0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
2c0f0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
2c100 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
2c110 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
2c120 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
2c130 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
2c140 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
2c150 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
2c160 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
2c170 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
2c180 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
2c190 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
2c1a0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
2c1b0 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
2c1c0 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
2c1d0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
2c1e0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
2c1f0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
2c200 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
2c210 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
2c220 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
2c230 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
2c240 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2c250 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
2c260 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
2c270 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
2c280 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
2c290 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
2c2a0 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
2c2b0 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
2c2c0 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
2c2d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2c2e0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
2c2f0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
2c300 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
2c310 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
2c320 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
2c330 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
2c340 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
2c350 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
2c360 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
2c370 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
2c380 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
2c390 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
2c3a0 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
2c3b0 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
2c3c0 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
2c3d0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
2c3e0 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
2c3f0 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
2c400 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
2c410 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
2c420 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
2c430 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
2c440 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
2c450 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
2c460 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
2c470 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
2c480 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
2c490 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
2c4a0 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
2c4b0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
2c4c0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
2c4d0 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
2c4e0 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
2c4f0 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
2c500 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
2c510 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
2c520 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
2c530 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
2c540 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
2c550 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
2c560 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
2c570 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
2c580 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
2c590 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
2c5a0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
2c5b0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
2c5c0 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
2c5d0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
2c5e0 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
2c5f0 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
2c600 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
2c610 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
2c620 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
2c630 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
2c640 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
2c650 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
2c660 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
2c670 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
2c680 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
2c690 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6b0 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
2c6c0 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
2c6d0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
2c6e0 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
2c6f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2c700 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
2c710 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
2c720 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
2c730 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
2c740 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
2c750 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
2c760 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
2c770 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
2c780 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
2c790 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
2c7a0 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
2c7b0 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
2c7c0 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
2c7d0 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
2c7e0 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
2c7f0 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
2c800 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
2c810 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
2c820 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
2c830 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
2c840 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
2c850 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
2c860 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
2c870 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
2c880 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
2c890 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
2c8a0 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
2c8b0 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
2c8c0 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
2c8d0 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72  [0])>0) or we ar
2c8e0 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72  e the.  ** a vir
2c8f0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
2c900 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
2c910 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
2c920 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
2c930 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
2c940 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
2c950 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
2c960 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
2c970 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
2c980 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
2c990 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
2c9a0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
2c9b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
2c9c0 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e  ate k new pages.
2c9d0 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65    Reuse old page
2c9e0 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  s where possible
2c9f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2ca00 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29   pPage->pgno>1 )
2ca10 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20  ;.  pageFlags = 
2ca20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b  pPage->aData[0];
2ca30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
2ca40 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
2ca50 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
2ca60 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
2ca70 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
2ca80 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
2ca90 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
2caa0 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20   pgnoOld[i];.   
2cab0 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
2cac0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2cad0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
2cae0 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
2caf0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
2cb00 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2cb10 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2cb20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2cb30 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
2cb40 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
2cb50 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2cb60 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
2cb70 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69  ew[i], pgnoNew[i
2cb80 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  -1], 0);.      i
2cb90 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2cba0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2cbb0 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70      apNew[i] = p
2cbc0 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  New;.      nNew+
2cbd0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
2cbe0 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20  /* Free any old 
2cbf0 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
2cc00 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65  not reused as ne
2cc10 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
2cc20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b  while( i<nOld ){
2cc30 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2cc40 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2cc50 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2cc60 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2cc70 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2cc80 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
2cc90 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
2cca0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
2ccb0 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65  .  ** Put the ne
2ccc0 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  w pages in accen
2ccd0 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69  ding order.  Thi
2cce0 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20  s helps to.  ** 
2ccf0 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20  keep entries in 
2cd00 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e  the disk file in
2cd10 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61   order so that a
2cd20 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68   scan.  ** of th
2cd30 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e  e table is a lin
2cd40 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
2cd50 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74   the file.  That
2cd60 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65  .  ** in turn he
2cd70 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e  lps the operatin
2cd80 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69  g system to deli
2cd90 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66  ver pages.  ** f
2cda0 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72  rom the disk mor
2cdb0 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a  e rapidly..  **.
2cdc0 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69    ** An O(n^2) i
2cdd0 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c  nsertion sort al
2cde0 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c  gorithm is used,
2cdf0 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20   but since.  ** 
2ce00 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  n is never more 
2ce10 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c  than NB (a small
2ce20 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74   constant), that
2ce30 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74   should.  ** not
2ce40 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20   be a problem.. 
2ce50 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42   **.  ** When NB
2ce60 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70  ==3, this one op
2ce70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73  timization makes
2ce80 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
2ce90 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73  ** about 25% fas
2cea0 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e  ter for large in
2ceb0 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c  sertions and del
2cec0 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  etions..  */.  f
2ced0 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69  or(i=0; i<k-1; i
2cee0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  ++){.    int min
2cef0 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  V = pgnoNew[i];.
2cf00 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
2cf10 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
2cf20 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
2cf30 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d    if( pgnoNew[j]
2cf40 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
2cf50 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
2cf60 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
2cf70 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a  V = pgnoNew[j];.
2cf80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2cf90 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a    if( minI>i ){.
2cfa0 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20        int t;.   
2cfb0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a     MemPage *pT;.
2cfc0 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65        t = pgnoNe
2cfd0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d  w[i];.      pT =
2cfe0 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
2cff0 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
2d000 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  noNew[minI];.   
2d010 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
2d020 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
2d030 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d   pgnoNew[minI] =
2d040 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b   t;.      apNew[
2d050 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
2d060 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
2d070 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
2d080 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28   %d %d  new: %d(
2d090 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
2d0a0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
2d0b0 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  n",.    pgnoOld[
2d0c0 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  0], .    nOld>=2
2d0d0 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20   ? pgnoOld[1] : 
2d0e0 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
2d0f0 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c   pgnoOld[2] : 0,
2d100 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c  .    pgnoNew[0],
2d110 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
2d120 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77  New>=2 ? pgnoNew
2d130 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  [1] : 0, nNew>=2
2d140 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
2d150 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70  .    nNew>=3 ? p
2d160 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e  gnoNew[2] : 0, n
2d170 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
2d180 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
2d190 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20  =4 ? pgnoNew[3] 
2d1a0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
2d1b0 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
2d1c0 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e   nNew>=5 ? pgnoN
2d1d0 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[4] : 0, nNew>
2d1e0 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
2d1f0 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  0));..  /*.  ** 
2d200 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
2d210 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
2d220 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
2d230 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
2d240 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
2d250 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
2d260 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
2d270 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
2d280 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
2d290 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
2d2a0 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
2d2b0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
2d2c0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
2d2d0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
2d2e0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
2d2f0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
2d300 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e  ssert( pNew->pgn
2d310 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b  o==pgnoNew[i] );
2d320 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
2d330 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
2d340 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2d350 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
2d360 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
2d370 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
2d380 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2d390 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
2d3a0 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
2d3b0 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
2d3c0 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
2d3d0 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  ow==0 );..    /*
2d3e0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2d3f0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2d400 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2d410 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
2d420 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ies.    ** that 
2d430 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62  point to the sib
2d440 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20  lings that were 
2d450 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73  rearranged. Thes
2d460 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20  e can be: left. 
2d470 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f     ** children o
2d480 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67  f cells, the rig
2d490 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ht-child of the 
2d4a0 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f  page, or overflo
2d4b0 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70  w pages.    ** p
2d4c0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c  ointed to by cel
2d4d0 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ls..    */.    i
2d4e0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2d4f0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a  ){.      for(k=j
2d500 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b  ; k<cntNew[i]; k
2d510 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
2d520 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73  ert( k<nMaxCells
2d530 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2d540 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c  aFrom[k]==0xFF |
2d550 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b  | apCopy[aFrom[k
2d560 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ]]->pgno!=pNew->
2d570 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
2d580 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2d590 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b  Ovfl(pNew, k-j);
2d5a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2d5b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d5c0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2d5d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2d5e0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2d5f0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70  pBt, get4byte(ap
2d600 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50  Cell[k]), PTRMAP
2d610 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
2d620 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  no);.          }
2d630 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2d640 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d650 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2d660 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2d670 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d690 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63      }..    j = c
2d6a0 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
2d6b0 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
2d6c0 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
2d6d0 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
2d6e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
2d6f0 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
2d700 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
2d710 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
2d720 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
2d730 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31      if( i<nNew-1
2d740 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20   && j<nCell ){. 
2d750 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a       u8 *pCell;.
2d760 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
2d770 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a  .      int sz;..
2d780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
2d790 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2d7a0 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c     pCell = apCel
2d7b0 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d  l[j];.      sz =
2d7c0 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61   szCell[j] + lea
2d7d0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
2d7e0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
2d7f0 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20  ce2[iSpace2];.  
2d800 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
2d810 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
2d820 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
2d830 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
2d840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
2d850 41 55 54 4f 56 41 43 55 55 4d 20 0a 20 20 20 20  AUTOVACUUM .    
2d860 20 20 20 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a       && (aFrom[j
2d870 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70  ]==0xFF || apCop
2d880 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e  y[aFrom[j]]->pgn
2d890 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20  o!=pNew->pgno). 
2d8a0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d8b0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2d8c0 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ut(pBt, get4byte
2d8d0 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f  (pCell), PTRMAP_
2d8e0 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e  BTREE, pNew->pgn
2d8f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
2d900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2d920 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2d930 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nup;.          }
2d940 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d950 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44   }else if( leafD
2d960 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
2d970 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
2d980 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
2d990 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
2d9a0 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
2d9b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2d9c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
2d9d0 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
2d9e0 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
2d9f0 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
2da00 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
2da10 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
2da20 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
2da30 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
2da40 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
2da50 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
2da60 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
2da70 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
2da80 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
2da90 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
2daa0 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71   j--;.        sq
2dab0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
2dac0 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
2dad0 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
2dae0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2daf0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 72  pTemp;.        r
2db00 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70  c = fillInCell(p
2db10 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30  Parent, pCell, 0
2db20 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
2db30 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20  0, 0, &sz);.    
2db40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2db50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2db60 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2db70 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
2db80 20 7d 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70   }.        pTemp
2db90 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2dba0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
2dbb0 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
2dbc0 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
2dbd0 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
2dbe0 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
2dbf0 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
2dc00 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
2dc10 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
2dc20 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
2dc30 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
2dc40 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
2dc50 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
2dc60 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
2dc70 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
2dc80 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
2dc90 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42 74  * (see sqlite3Bt
2dca0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2dcb0 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
2dcc0 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
2dcd0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
2dce0 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
2dcf0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
2dd00 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
2dd10 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
2dd20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
2dd30 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
2dd40 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
2dd50 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2dd60 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
2dd70 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
2dd80 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
2dd90 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
2dda0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
2ddb0 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
2ddc0 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
2ddd0 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
2dde0 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
2ddf0 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
2de00 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
2de10 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
2de20 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
2de30 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
2de40 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
2de50 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
2de60 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
2de70 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
2de80 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
2de90 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
2dea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2deb0 20 20 20 20 20 69 53 70 61 63 65 32 20 2b 3d 20       iSpace2 += 
2dec0 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
2ded0 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
2dee0 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
2def0 73 73 65 72 74 28 20 69 53 70 61 63 65 32 3c 3d  ssert( iSpace2<=
2df00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
2df10 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
2df20 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
2df30 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
2df40 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20  , pTemp, 4);.   
2df50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2df60 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
2df70 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2df80 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2df90 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2dfa0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2dfb0 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 70 75  age) );.      pu
2dfc0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2dfd0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
2dfe0 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67  nxDiv), pNew->pg
2dff0 6e 6f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  no);..      /* I
2e000 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
2e010 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
2e020 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61  e, and not a lea
2e030 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20  f-data tree,.   
2e040 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74     ** then updat
2e050 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
2e060 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20  p with an entry 
2e070 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
2e080 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74   page.      ** t
2e090 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73  hat the cell jus
2e0a0 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74  t inserted point
2e0b0 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20  s to (if any).. 
2e0c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2e0d0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26  ( ISAUTOVACUUM &
2e0e0 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  & !leafData ){. 
2e0f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2e100 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e  apPutOvfl(pParen
2e110 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20  t, nxDiv);.     
2e120 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e140 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2e150 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
2e160 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2e170 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
2e180 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ++;.    }..    /
2e190 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
2e1a0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
2e1b0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
2e1c0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  page. */.    if(
2e1d0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2e1e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2e1f0 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d  apPut(pBt, pNew-
2e200 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2e210 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2e220 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2e230 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e240 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2e250 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2e260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2e270 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
2e280 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
2e290 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
2e2a0 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
2e2b0 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
2e2c0 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
2e2d0 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20  .    u8 *zChild 
2e2e0 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31  = &apCopy[nOld-1
2e2f0 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20  ]->aData[8];.   
2e300 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e   memcpy(&apNew[n
2e310 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  New-1]->aData[8]
2e320 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20  , zChild, 4);.  
2e330 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2e340 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  UM ){.      rc =
2e350 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2e360 67 65 74 34 62 79 74 65 28 7a 43 68 69 6c 64 29  get4byte(zChild)
2e370 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2e380 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70  apNew[nNew-1]->p
2e390 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2e3a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e3b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61  .        goto ba
2e3c0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2e3d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e3e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2e3f0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2e400 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2e410 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 6e 78  age) );.  if( nx
2e420 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Div==pParent->nC
2e430 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  ell+pParent->nOv
2e440 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a  erflow ){.    /*
2e450 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
2e460 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74  ing is the right
2e470 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  -most child of p
2e480 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75  Parent */.    pu
2e490 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
2e4a0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2e4b0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
2e4c0 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
2e4d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2e4e0 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
2e4f0 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63  ng is the left c
2e500 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73  hild of the firs
2e510 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65  t entry in pPare
2e520 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  nt.    ** past t
2e530 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69  he right-most di
2e540 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20  vider entry */. 
2e550 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
2e560 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
2e570 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67  rent, nxDiv), pg
2e580 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
2e590 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42    }..  /*.  ** B
2e5a0 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
2e5b0 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68  t page.  Note th
2e5c0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
2e5d0 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68  age (pPage) migh
2e5e0 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  t.  ** have been
2e5f0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
2e600 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67  eelist so it mig
2e610 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ht no longer be 
2e620 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2e630 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74  * But the parent
2e640 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79   page will alway
2e650 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  s be initialized
2e660 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2e670 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
2e680 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72   );.  sqlite3Scr
2e690 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
2e6a0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a  ;.  apCell = 0;.
2e6b0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2e6c0 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  E: finished with
2e6d0 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d   %d: old=%d new=
2e6e0 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
2e6f0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2e700 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65  >pgno, nOld, nNe
2e710 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 70 50  w, nCell));.  pP
2e720 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
2e730 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
2e740 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72  e(pPage);.  pCur
2e750 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 72 63 20  ->iPage--;.  rc 
2e760 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
2e770 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  0);.  .  /*.  **
2e780 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20   Cleanup before 
2e790 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  returning..  */.
2e7a0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a  balance_cleanup:
2e7b0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
2e7c0 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20 73  ee(aSpace2);.  s
2e7d0 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
2e7e0 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
2e7f0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
2e800 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2e810 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2e820 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2e830 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
2e840 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
2e850 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 43 75  w[i]);.  }.  pCu
2e860 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2e870 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
2e880 77 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  w = 0;..  return
2e890 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2e8a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2e8b0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  lled for the roo
2e8c0 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65  t page of a btre
2e8d0 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a  e when the root.
2e8e0 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
2e8f0 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73   no cells.  This
2e900 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   is an opportuni
2e910 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ty to make the t
2e920 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72  ree.** shallower
2e930 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a   by one level..*
2e940 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2e950 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42  ance_shallower(B
2e960 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2e970 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2e990 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 42  * Root page of B
2e9a0 2d 54 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  -Tree */.  MemPa
2e9b0 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20  ge *pChild;     
2e9c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
2e9d0 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f  nly child page o
2e9e0 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  f pPage */.  Pgn
2e9f0 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
2ea00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2ea10 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68  e number for pCh
2ea20 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ild */.  int rc 
2ea30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2ea40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ea50 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  code from subpro
2ea60 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53  cedures */.  BtS
2ea70 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ea90 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73  The main BTree s
2eaa0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
2eab0 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b  t mxCellPerPage;
2eac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2ead0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2eae0 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a  cells per page *
2eaf0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
2eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb10 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72   /* All cells fr
2eb20 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62  om pages being b
2eb30 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
2eb40 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
2eb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
2eb60 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
2eb70 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ells */..  asser
2eb80 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  t( pCur->iPage==
2eb90 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  0 );.  pPage = p
2eba0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
2ebb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ebc0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2ebd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2ebe0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2ebf0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2ec00 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
2ec10 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72  pBt;.  mxCellPer
2ec20 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70  Page = MX_CELL(p
2ec30 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20  Bt);.  apCell = 
2ec40 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d  sqlite3Malloc( m
2ec50 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69  xCellPerPage*(si
2ec60 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66  zeof(u8*)+sizeof
2ec70 28 75 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20  (u16)) );.  if( 
2ec80 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  apCell==0 ) retu
2ec90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2eca0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
2ecb0 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c  *)&apCell[mxCell
2ecc0 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  PerPage];.  if( 
2ecd0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2ece0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2ecf0 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  is completely em
2ed00 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45  pty */.    TRACE
2ed10 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74  (("BALANCE: empt
2ed20 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70  y table %d\n", p
2ed30 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2ed40 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2ed50 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2ed60 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65  mpty but has one
2ed70 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65   child.  Transfe
2ed80 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66  r the.    ** inf
2ed90 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2eda0 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74  at one child int
2edb0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2edc0 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  if it .    ** wi
2edd0 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65  ll fit.  This re
2ede0 64 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20  duces the depth 
2edf0 6f 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f  of the tree by o
2ee00 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
2ee10 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * If the root pa
2ee20 67 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74  ge is page 1, it
2ee30 20 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20   has less space 
2ee40 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20  available than. 
2ee50 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20     ** its child 
2ee60 28 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20  (due to the 100 
2ee70 62 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74  byte header that
2ee80 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62   occurs at the b
2ee90 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eginning.    ** 
2eea0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2eeb0 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68  fle), so it migh
2eec0 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  t not be able to
2eed0 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65   hold all of the
2eee0 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61   .    ** informa
2eef0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63  tion currently c
2ef00 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
2ef10 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20  child.  If this 
2ef20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  is the .    ** c
2ef30 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ase, then do not
2ef40 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72   do the transfer
2ef50 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20  .  Leave page 1 
2ef60 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20  empty except.   
2ef70 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68   ** for the righ
2ef80 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  t-pointer to the
2ef90 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
2efa0 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63  e child page bec
2efb0 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  omes.    ** the 
2efc0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
2efd0 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f  the tree..    */
2efe0 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70  .    VVA_ONLY( p
2eff0 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
2f000 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 70 67  ed = 1 );.    pg
2f010 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
2f020 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2f030 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2f040 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
2f050 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29  t( pgnoChild>0 )
2f060 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
2f070 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61  noChild<=pagerPa
2f080 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  gecount(pPage->p
2f090 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
2f0a0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
2f0b0 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  age(pPage->pBt, 
2f0c0 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69  pgnoChild, &pChi
2f0d0 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ld, 0);.    if( 
2f0e0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
2f0f0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
2f100 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67     if( pPage->pg
2f110 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  no==1 ){.      r
2f120 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2f130 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 29  InitPage(pChild)
2f140 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2f150 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2f160 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
2f170 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2f180 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2f190 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c  .      if( pChil
2f1a0 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b  d->nFree>=100 ){
2f1b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2f1c0 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f  child informatio
2f1d0 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  n will fit on th
2f1e0 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20  e root page, so 
2f1f0 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  do the.        *
2f200 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20  * copy */.      
2f210 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
2f220 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2f230 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
2f240 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ]);.        for(
2f250 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
2f260 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2f270 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20        apCell[i] 
2f280 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c  = findCell(pChil
2f290 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d,i);.          
2f2a0 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c  szCell[i] = cell
2f2b0 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20  SizePtr(pChild, 
2f2c0 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  apCell[i]);.    
2f2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2f2e0 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65  semblePage(pPage
2f2f0 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c  , pChild->nCell,
2f300 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29   apCell, szCell)
2f310 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;.        /* Cop
2f320 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  y the right-poin
2f330 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
2f340 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20   to the parent. 
2f350 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2f360 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2f370 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2f380 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2f390 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2f3a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2f3b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2f3c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  , .            g
2f3d0 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d  et4byte(&pChild-
2f3e0 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68  >aData[pChild->h
2f3f0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
2f400 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2f410 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2f420 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
2f430 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
2f440 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65  transfer to page
2f450 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
2f460 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gno));.      }el
2f470 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2f480 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72  he child has mor
2f490 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  e information th
2f4a0 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  at will fit on t
2f4b0 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20  he root..       
2f4c0 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20   ** The tree is 
2f4d0 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64  already balanced
2f4e0 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  .  Do nothing. *
2f4f0 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  /.        TRACE(
2f500 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
2f510 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74   %d will not fit
2f520 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   on page 1\n", p
2f530 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
2f540 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2f550 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2f560 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68  Page->aData, pCh
2f570 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67  ild->aData, pPag
2f580 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2f590 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
2f5a0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2f5b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f5c0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
2f5d0 61 67 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  age);.      asse
2f5e0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2f5f0 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50  K );.      freeP
2f600 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
2f610 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2f620 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69  CE: transfer chi
2f630 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20  ld %d into root 
2f640 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2f650 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e       pChild->pgn
2f660 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  o, pPage->pgno))
2f670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2f680 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2f690 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  flow==0 );.#ifnd
2f6a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f6b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2f6c0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26  ( ISAUTOVACUUM &
2f6d0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2f6e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  ){.      rc = se
2f6f0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 50  tChildPtrmaps(pP
2f700 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
2f710 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  if.    releasePa
2f720 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a  ge(pChild);.  }.
2f730 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2f740 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  nce:.  sqlite3_f
2f750 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72  ree(apCell);.  r
2f760 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2f770 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67  .** The root pag
2f780 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a  e is overfull.**
2f790 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61  .** When this ha
2f7a0 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20  ppens, Create a 
2f7b0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61  new child page a
2f7c0 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63  nd copy the.** c
2f7d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
2f7e0 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69  oot into the chi
2f7f0 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74  ld.  Then make t
2f800 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
2f810 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  an empty page wi
2f820 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f  th rightChild po
2f830 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
2f840 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69  w.** child.   Fi
2f850 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61  nally, call bala
2f860 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f  nce_internal() o
2f870 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a  n the new child.
2f880 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74  ** to cause it t
2f890 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74  o split..*/.stat
2f8a0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
2f8b0 65 65 70 65 72 28 42 74 43 75 72 73 6f 72 20 2a  eeper(BtCursor *
2f8c0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f8e0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
2f8f0 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
2f900 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2f910 61 67 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  age;     /* Poin
2f920 74 65 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ter to the root 
2f930 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  page */.  MemPag
2f940 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a  e *pChild;    /*
2f950 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   Pointer to a ne
2f960 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
2f970 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
2f980 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75  ;     /* Page nu
2f990 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
2f9a0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2f9b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
2f9c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
2f9d0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
2f9e0 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  bleSize;     /* 
2f9f0 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a  Total usable siz
2fa00 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20  e of a page */. 
2fa10 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
2fa20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2fa30 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
2fa40 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74  ge */.  u8 *cdat
2fa50 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  a;          /* C
2fa60 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68  ontent of the ch
2fa70 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ild page */.  in
2fa80 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
2fa90 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70    /* Offset to p
2faa0 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70 61  age header in pa
2fab0 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rent */.  int cb
2fac0 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rk;           /*
2fad0 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65   Offset to conte
2fae0 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  nt of first cell
2faf0 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20   in parent */.. 
2fb00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2fb10 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Page==0 );.  ass
2fb20 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2fb30 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  e[0]->nOverflow>
2fb40 30 20 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59  0 );..  VVA_ONLY
2fb50 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75  ( pCur->pagesShu
2fb60 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 70  ffled = 1 );.  p
2fb70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2fb80 61 67 65 5b 30 5d 3b 0a 20 20 70 42 74 20 3d 20  age[0];.  pBt = 
2fb90 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
2fba0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2fbb0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2fbc0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2fbd0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2fbe0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2fbf0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
2fc00 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2fc10 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69  ePage(pBt, &pChi
2fc20 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20  ld, &pgnoChild, 
2fc30 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b  pPage->pgno, 0);
2fc40 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2fc50 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
2fc60 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2fc70 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
2fc80 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75  >pDbPage) );.  u
2fc90 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
2fca0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
2fcb0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2fcc0 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
2fcd0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2fce0 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28  cbrk = get2byte(
2fcf0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
2fd00 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d   cdata = pChild-
2fd10 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79  >aData;.  memcpy
2fd20 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64  (cdata, &data[hd
2fd30 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r], pPage->cellO
2fd40 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
2fd50 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d  Cell-hdr);.  mem
2fd60 63 70 79 28 26 63 64 61 74 61 5b 63 62 72 6b 5d  cpy(&cdata[cbrk]
2fd70 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
2fd80 73 61 62 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b  sableSize-cbrk);
2fd90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  ..  assert( pChi
2fda0 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  ld->isInit==0 );
2fdb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2fdc0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68  treeInitPage(pCh
2fdd0 69 6c 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ild);.  if( rc==
2fde0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fdf0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 50 61   int nCopy = pPa
2fe00 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69  ge->nOverflow*si
2fe10 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
2fe20 6c 5b 30 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  l[0]);.    memcp
2fe30 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
2fe40 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 6e   pPage->aOvfl, n
2fe50 43 6f 70 79 29 3b 0a 20 20 20 20 70 43 68 69 6c  Copy);.    pChil
2fe60 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  d->nOverflow = p
2fe70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  Page->nOverflow;
2fe80 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d  .    if( pChild-
2fe90 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2fea0 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65      pChild->nFre
2feb0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
2fec0 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2fed0 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e  >nCell==pPage->n
2fee0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  Cell );.    asse
2fef0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2ff00 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2ff10 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
2ff20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2ff30 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
2ff40 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
2ff50 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
2ff60 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2ff70 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2ff80 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2ff90 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2ffa0 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
2ffb0 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67  into %d\n", pPag
2ffc0 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  e->pgno, pChild-
2ffd0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28  >pgno));.    if(
2ffe0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2fff0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
30000 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c  apPut(pBt, pChil
30010 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  d->pgno, PTRMAP_
30020 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67  BTREE, pPage->pg
30030 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
30040 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30050 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 72 63  UUM.      if( rc
30060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30070 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 43         rc = setC
30080 68 69 6c 64 50 74 72 6d 61 70 73 28 70 43 68 69  hildPtrmaps(pChi
30090 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ld);.      }.   
300a0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
300b0 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76       pChild->nOv
300c0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
300d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
300e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
300f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30100 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
30110 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
30120 5b 31 5d 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20  [1] = pChild;.  
30130 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
30140 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
30150 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
30160 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
30170 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30180 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72  Child);.  }..  r
30190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
301a0 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  ** The page that
301b0 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20   pCur currently 
301c0 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75  points to has ju
301d0 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  st been modified
301e0 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e   in.** some way.
301f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
30200 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68  igures out if th
30210 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  is modification 
30220 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65  means the.** tre
30230 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
30240 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73  lanced, and if s
30250 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72  o calls the appr
30260 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
30270 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a  g .** routine..*
30280 2a 20 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  * .** Parameter 
30290 69 73 49 6e 73 65 72 74 20 69 73 20 74 72 75 65  isInsert is true
302a0 20 69 66 20 61 20 6e 65 77 20 63 65 6c 6c 20 77   if a new cell w
302b0 61 73 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  as just inserted
302c0 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67   into the.** pag
302d0 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  e, or false othe
302e0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
302f0 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43   int balance(BtC
30300 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
30310 20 69 73 49 6e 73 65 72 74 29 7b 0a 20 20 69 6e   isInsert){.  in
30320 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30330 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
30340 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
30350 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
30360 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30370 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
30380 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
30390 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
303a0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
303b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
303c0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
303d0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
303e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
303f0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30400 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  w>0 ){.      rc 
30410 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
30420 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73  (pCur);.      as
30430 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
30440 67 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a  ge[0]==pPage );.
30450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
30460 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
30470 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
30480 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OK );.    }.    
30490 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
304a0 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  K && pPage->nCel
304b0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
304c0 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c   = balance_shall
304d0 6f 77 65 72 28 70 43 75 72 29 3b 0a 20 20 20 20  ower(pCur);.    
304e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
304f0 61 70 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67 65  apPage[0]==pPage
30500 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
30510 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
30520 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c  ow==0 || rc!=SQL
30530 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a  ITE_OK );.    }.
30540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
30550 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30560 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  w>0 || .        
30570 28 21 69 73 49 6e 73 65 72 74 20 26 26 20 70 50  (!isInsert && pP
30580 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65  age->nFree>pPage
30590 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
305a0 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20  e*2/3) ){.      
305b0 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
305c0 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20  root(pCur);.    
305d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
305e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
305f0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
30600 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74  all cursors that
30610 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20   point to table 
30620 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20  pgnoRoot..** If 
30630 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72  any of those cur
30640 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64  sors were opened
30650 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
30660 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  in a different.*
30670 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
30680 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73  ction (a databas
30690 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61  e connection tha
306a0 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67  t shares the pag
306b0 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68  er.** cache with
306c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
306d0 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61  nection) and tha
306e0 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  t other connecti
306f0 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e  on .** is not in
30700 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d   the ReadUncommm
30710 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65  itted state, the
30720 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
30730 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
30740 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20  E_LOCKED..**.** 
30750 41 73 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f  As well as curso
30760 72 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  rs with wrFlag==
30770 30 2c 20 63 75 72 73 6f 72 73 20 77 69 74 68 20  0, cursors with 
30780 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f 62 48 61  .** isIncrblobHa
30790 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f  ndle==1 are also
307a0 20 63 6f 6e 73 69 64 65 72 65 64 20 27 72 65 61   considered 'rea
307b0 64 27 20 63 75 72 73 6f 72 73 20 62 65 63 61 75  d' cursors becau
307c0 73 65 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61  se.** incrementa
307d0 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 61  l blob cursors a
307e0 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  re used for both
307f0 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69   reading and wri
30800 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ting..**.** When
30810 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
30820 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 6e   root page of an
30830 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74   intkey table, t
30840 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30850 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  also.** responsi
30860 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69 64 61  ble for invalida
30870 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c  ting incremental
30880 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 77 68   blob cursors wh
30890 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 77  en the table row
308a0 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65  .** on which the
308b0 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69 73 20  y are opened is 
308c0 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69 66  deleted or modif
308d0 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61 72 65  ied. Cursors are
308e0 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
308f0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
30900 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73   following rules
30910 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65  :.**.**   1) Whe
30920 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  n BtreeClearTabl
30930 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  e() is called to
30940 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65   completely dele
30950 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  te the contents.
30960 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42 2d 54  **      of a B-T
30970 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78 63 6c  ree table, pExcl
30980 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ude is set to ze
30990 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72  ro and parameter
309a0 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20   iRow is .**    
309b0 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72    set to non-zer
309c0 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  o. In this case 
309d0 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  all incremental 
309e0 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
309f0 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  n.**      on the
30a00 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
30a10 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e   pgnoRoot are in
30a20 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  validated..**.**
30a30 20 20 20 32 29 20 57 68 65 6e 20 42 74 72 65 65     2) When Btree
30a40 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65 65 44  Insert(), BtreeD
30a50 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
30a60 50 75 74 44 61 74 61 28 29 20 69 73 20 63 61 6c  PutData() is cal
30a70 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  led to .**      
30a80 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65 20 72  modify a table r
30a90 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20 73 74  ow via an SQL st
30aa0 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64  atement, pExclud
30ab0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
30ac0 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65 20 63  .**      write c
30ad0 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 64 6f  ursor used to do
30ae0 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f   the modificatio
30af0 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20  n and parameter 
30b00 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a 20 20  iRow is set.**  
30b10 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 67      to the integ
30b20 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74 68 65  er row id of the
30b30 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20 62 65   B-Tree entry be
30b40 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e  ing modified. Un
30b50 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70 45 78  less.**      pEx
30b60 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c 66 20  clude is itself 
30b70 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
30b80 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  lob cursor, then
30b90 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c   all incremental
30ba0 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20 63 75  .**      blob cu
30bb0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f  rsors open on ro
30bc0 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20 42 2d  w iRow of the B-
30bd0 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c 69 64  Tree are invalid
30be0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29  ated..**.**   3)
30bf0 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c 75 64   If both pExclud
30c00 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65 20 73  e and iRow are s
30c10 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69  et to zero, no i
30c20 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
30c30 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f 72 73  .**      cursors
30c40 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
30c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30c60 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66  checkForReadConf
30c70 6c 69 63 74 73 28 0a 20 20 42 74 72 65 65 20 2a  licts(.  Btree *
30c80 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
30c90 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
30ca0 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
30cb0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  /.  Pgno pgnoRoo
30cc0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  t,          /* L
30cd0 6f 6f 6b 20 66 6f 72 20 72 65 61 64 20 63 75 72  ook for read cur
30ce0 73 6f 72 73 20 6f 6e 20 74 68 69 73 20 62 74 72  sors on this btr
30cf0 65 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  ee */.  BtCursor
30d00 20 2a 70 45 78 63 6c 75 64 65 2c 20 20 20 20 20   *pExclude,     
30d10 2f 2a 20 49 67 6e 6f 72 65 20 74 68 69 73 20 63  /* Ignore this c
30d20 75 72 73 6f 72 20 2a 2f 0a 20 20 69 36 34 20 69  ursor */.  i64 i
30d30 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20  Row             
30d40 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
30d50 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
30d60 61 6e 67 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 42  anging */.){.  B
30d70 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74  tCursor *p;.  Bt
30d80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42  Shared *pBt = pB
30d90 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c  tree->pBt;.  sql
30da0 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65  ite3 *db = pBtre
30db0 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
30dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
30dd0 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
30de0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
30df0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
30e00 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
30e10 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
30e20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
30e30 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67   p->pgnoRoot!=pg
30e40 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75  noRoot ) continu
30e50 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
30e60 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
30e70 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63      if( p->isInc
30e80 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28  rblobHandle && (
30e90 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45 78   .         (!pEx
30ea0 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a 20  clude && iRow). 
30eb0 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75 64       || (pExclud
30ec0 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d 3e  e && !pExclude->
30ed0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
30ee0 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   && p->info.nKey
30ef0 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a  ==iRow).    )){.
30f00 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
30f10 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
30f20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
30f30 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
30f40 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
30f50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
30f60 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
30f70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30f80 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
30f90 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62     || p->isIncrb
30fa0 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66  lobHandle.#endif
30fb0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
30fc0 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d  lite3 *dbOther =
30fd0 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a   p->pBtree->db;.
30fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 64 62 4f        assert(dbO
30ff0 74 68 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ther);.      if(
31000 20 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20   dbOther!=db && 
31010 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20  (dbOther->flags 
31020 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
31030 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 20 29 7b 0a  ommitted)==0 ){.
31040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
31050 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
31060 28 64 62 2c 20 64 62 4f 74 68 65 72 29 3b 0a 20  (db, dbOther);. 
31070 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
31080 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
31090 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d  EDCACHE;.      }
310a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
310b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
310c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
310d0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
310e0 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
310f0 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
31100 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
31110 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
31120 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
31130 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
31140 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
31150 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
31160 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
31170 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
31180 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
31190 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
311a0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
311b0 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
311c0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
311d0 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
311e0 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
311f0 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
31200 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
31210 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
31220 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
31230 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
31240 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
31250 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
31260 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
31270 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
31280 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
31290 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
312a0 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
312b0 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
312c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
312d0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
312e0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
312f0 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
31300 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
31310 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
31320 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
31330 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
31340 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
31350 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
31360 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
31370 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
31380 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
31390 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
313a0 70 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20  pendBias        
313b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
313c0 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
313d0 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
313e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
313f0 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a  nt loc;.  int sz
31400 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  New;.  int idx;.
31410 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31420 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
31430 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
31440 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
31450 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
31460 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
31470 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
31480 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
31490 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
314a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
314b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
314c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
314d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
314e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
314f0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
31500 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
31510 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63 68  lag );.  rc = ch
31520 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69  eckForReadConfli
31530 63 74 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cts(pCur->pBtree
31540 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
31550 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 3b 0a 20  , pCur, nKey);. 
31560 20 69 66 28 20 72 63 20 29 7b 20 20 20 20 20 20   if( rc ){      
31570 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 54         .    /* T
31580 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
31590 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
315a0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61  ad lock */.    a
315b0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
315c0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
315d0 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65 74 75  ACHE );.    retu
315e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
315f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
31600 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
31610 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
31620 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  skip;.  }..  /* 
31630 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
31640 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
31650 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
31660 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  this table..  **
31670 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61  .  ** In some ca
31680 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ses, the call to
31690 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
316a0 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73 20 61  eto() below is a
316b0 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a   no-op. For.  **
316c0 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69   example, when i
316d0 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20 69 6e  nserting data in
316e0 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
316f0 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 69  auto-generated i
31700 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73  nteger.  ** keys
31710 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79 65 72  , the VDBE layer
31720 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33   invokes sqlite3
31730 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f 20 66  BtreeLast() to f
31740 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 0a 20  igure out the . 
31750 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65 79 20   ** integer key 
31760 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65 6e 20  to use. It then 
31770 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
31780 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ion to actually 
31790 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20 2a 2a  insert the .  **
317a0 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 69   data into the i
317b0 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20 49 6e  ntkey B-Tree. In
317c0 20 74 68 69 73 20 63 61 73 65 20 73 71 6c 69 74   this case sqlit
317d0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  e3BtreeMoveto() 
317e0 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20  recognizes.  ** 
317f0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
31800 69 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 65  is already where
31810 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
31820 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 68  and returns with
31830 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61  out.  ** doing a
31840 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69  ny work. To avoi
31850 64 20 74 68 77 61 72 74 69 6e 67 20 74 68 65 73  d thwarting thes
31860 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c  e optimizations,
31870 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
31880 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65  .  ** not to cle
31890 61 72 20 74 68 65 20 63 75 72 73 6f 72 20 68 65  ar the cursor he
318a0 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a  re..  */.  if( .
318b0 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
318c0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
318d0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
318e0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20  gnoRoot, pCur)) 
318f0 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ||.    SQLITE_OK
31900 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
31910 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
31920 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
31930 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
31940 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
31950 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
31960 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
31970 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
31980 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
31990 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30  ntKey || nKey>=0
319a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
319b0 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50  age->leaf || !pP
319c0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
319d0 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
319e0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
319f0 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
31a00 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
31a10 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
31a20 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
31a30 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
31a40 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
31a50 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
31a60 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
31a70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
31a80 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
31a90 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
31aa0 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
31ab0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
31ac0 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
31ad0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
31ae0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
31af0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
31b00 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
31b10 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
31b20 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
31b30 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
31b40 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
31b50 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
31b60 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
31b70 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
31b80 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
31b90 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
31ba0 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
31bb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
31bc0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
31bd0 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
31be0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
31bf0 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ate ){.    u16 s
31c00 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
31c10 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ( idx<pPage->nCe
31c20 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
31c30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31c40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31c50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
31c60 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
31c70 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
31c80 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
31c90 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
31ca0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
31cb0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
31cc0 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
31cd0 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
31ce0 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
31cf0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
31d00 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
31d10 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
31d20 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
31d30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
31d40 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
31d50 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70   rc = dropCell(p
31d60 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64  Page, idx, szOld
31d70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31d80 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
31d90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
31da0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rt;.    }.  }els
31db0 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
31dc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
31dd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31de0 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
31df0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
31e00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
31e10 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
31e20 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
31e30 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
31e40 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
31e50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
31e60 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
31e70 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
31e80 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65  Page, idx, newCe
31e90 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29  ll, szNew, 0, 0)
31ea0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
31eb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
31ec0 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
31ed0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 75  1);.  }..  /* Mu
31ee0 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76  st make sure nOv
31ef0 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74 20  erflow is reset 
31f00 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20  to zero even if 
31f10 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20 20  the balance().  
31f20 2a 2a 20 66 61 69 6c 73 2e 20 20 49 6e 74 65 72  ** fails.  Inter
31f30 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
31f40 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  re corruption wi
31f50 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72 77  ll result otherw
31f60 69 73 65 2e 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  ise. */.  pCur->
31f70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
31f80 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ge]->nOverflow =
31f90 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   0;..  if( rc==S
31fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31fb0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
31fc0 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74  ;.  }.end_insert
31fd0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
31fe0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
31ff0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
32000 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
32010 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75  ting to.  The cu
32020 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
32030 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72  pointing at a ar
32040 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e  bitrary location
32050 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
32060 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
32070 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
32080 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
32090 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
320a0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e 74  r->iPage];.  int
320b0 20 69 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64   idx;.  unsigned
320c0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
320d0 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
320e0 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  gnoChild = 0;.  
320f0 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
32100 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
32110 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
32120 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
32130 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
32140 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
32150 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
32160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
32170 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
32180 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
32190 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
321a0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
321b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
321c0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
321d0 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
321e0 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28  >skip;.  }.  if(
321f0 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49   NEVER(pCur->aiI
32200 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
32210 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 20 29  =pPage->nCell) )
32220 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32230 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54  ITE_ERROR;  /* T
32240 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
32250 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79   pointing to any
32260 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 61  thing */.  }.  a
32270 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
32280 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63 68  lag );.  rc = ch
32290 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69  eckForReadConfli
322a0 63 74 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  cts(p, pCur->pgn
322b0 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75  oRoot, pCur, pCu
322c0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20  r->info.nKey);. 
322d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
322e0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
322f0 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
32300 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
32310 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61 73 73   lock */.    ass
32320 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
32330 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
32340 48 45 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  HE );.    return
32350 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   rc;.  }..  /* R
32360 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
32370 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
32380 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74  on (a no-op if t
32390 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
323a0 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52   in .  ** CURSOR
323b0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
323c0 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65  te) and save the
323d0 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
323e0 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
323f0 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68  .  ** open on th
32400 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68  e same table. Th
32410 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  en call sqlite3P
32420 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
32430 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61  he page.  ** tha
32440 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c  t the entry will
32450 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
32460 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
32470 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43    (rc = restoreC
32480 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
32490 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
324a0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
324b0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
324c0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21  gnoRoot, pCur))!
324d0 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20  =0 ||.    (rc = 
324e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
324f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
32500 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  ))!=0.  ){.    r
32510 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
32520 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
32530 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70  ell within its p
32540 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
32550 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
32560 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
32570 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
32580 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
32590 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
325a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
325b0 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
325c0 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
325d0 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
325e0 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  /.  idx = pCur->
325f0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
32600 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  e];.  pCell = fi
32610 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
32620 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  x);.  if( !pPage
32630 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
32640 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
32650 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20  te(pCell);.  }. 
32660 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
32670 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
32680 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
32690 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
326a0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
326b0 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  f ){.    /*.    
326c0 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20  ** The entry we 
326d0 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c  are about to del
326e0 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  ete is not a lea
326f0 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f  f so if we do no
32700 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65  t.    ** do some
32710 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65  thing we will le
32720 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e  ave a hole on an
32730 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a   internal page..
32740 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74      ** We have t
32750 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20  o fill the hole 
32760 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63  by moving in a c
32770 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e  ell from a leaf.
32780 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78    The.    ** nex
32790 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65  t Cell after the
327a0 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74   one to be delet
327b0 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ed is guaranteed
327c0 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20   to exist and.  
327d0 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61    ** to be a lea
327e0 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20  f so we can use 
327f0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42  it..    */.    B
32800 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b  tCursor leafCur;
32810 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c  .    MemPage *pL
32820 65 61 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  eafPage = 0;..  
32830 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32840 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20  *pNext;.    int 
32850 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73  notUsed;.    uns
32860 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
32870 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  Cell = 0;.    as
32880 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69 6e  sert( !pPage->in
32890 74 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69  tKey );.    sqli
328a0 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
328b0 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61  ursor(pCur, &lea
328c0 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  fCur);.    rc = 
328d0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
328e0 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
328f0 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
32900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32910 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
32920 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43  fCur.aiIdx[leafC
32930 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a  ur.iPage]==0 );.
32940 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20        pLeafPage 
32950 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  = leafCur.apPage
32960 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b  [leafCur.iPage];
32970 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
32980 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
32990 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65  eafPage->pDbPage
329a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
329b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
329c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61 66  {.      int leaf
329d0 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20  CursorInvalid = 
329e0 30 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e  0;.      u16 szN
329f0 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ext;.      TRACE
32a00 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
32a10 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72  =%d delete inter
32a20 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c  nal from %d repl
32a30 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ace from leaf %d
32a40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43  \n",.         pC
32a50 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
32a60 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66  age->pgno, pLeaf
32a70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
32a80 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
32a90 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ge, idx, cellSiz
32aa0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
32ab0 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  l));.      pNext
32ac0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61   = findCell(pLea
32ad0 66 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  fPage, 0);.     
32ae0 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69   szNext = cellSi
32af0 7a 65 50 74 72 28 70 4c 65 61 66 50 61 67 65 2c  zePtr(pLeafPage,
32b00 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
32b10 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
32b20 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
32b30 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  +4 );.      allo
32b40 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
32b50 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65  t);.      tempCe
32b60 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
32b70 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ace;.      if( t
32b80 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
32b90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32ba0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
32bb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
32bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32bd0 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43      rc = insertC
32be0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
32bf0 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b  pNext-4, szNext+
32c00 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b  4, tempCell, 0);
32c10 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
32c20 20 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74 61   /* The "if" sta
32c30 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e 65  tement in the ne
32c40 78 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73  xt code block is
32c50 20 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65 0a   critical.  The.
32c60 20 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74 65        ** slighte
32c70 73 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61 74  st error in that
32c80 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64   statement would
32c90 20 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f   allow SQLite to
32ca0 20 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20 2a   operate.      *
32cb0 2a 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74  * correctly most
32cc0 20 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75 74   of the time but
32cd0 20 70 72 6f 64 75 63 65 20 76 65 72 79 20 72 61   produce very ra
32ce0 72 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54 6f  re failures.  To
32cf0 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64 20  .      ** guard 
32d00 61 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74 68  against this, th
32d10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
32d20 6f 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69 66  os help to verif
32d30 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  y that.      ** 
32d40 74 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65  the "if" stateme
32d50 6e 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74 65  nt is well teste
32d60 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
32d70 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
32d80 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
32d90 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
32da0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
32db0 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20  2/3 .           
32dc0 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
32dd0 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
32de0 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
32df0 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
32e00 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
32e10 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
32e20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  && pPage->nFree=
32e30 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
32e40 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20  *2/3 .          
32e50 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
32e60 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
32e70 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
32e80 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
32e90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
32ea0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
32eb0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
32ec0 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ==pBt->usableSiz
32ed0 65 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20 20  e*2/3+1 .       
32ee0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
32ef0 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
32f00 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
32f10 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
32f20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
32f30 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
32f40 3e 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  >0 && pPage->nFr
32f50 65 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ee<=pBt->usableS
32f60 69 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20 20  ize*2/3.        
32f70 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61           && pLea
32f80 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
32f90 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
32fa0 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20  bleSize*2/3 );. 
32fb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
32fc0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
32fd0 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46  >0 || (pPage->nF
32fe0 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ree > pBt->usabl
32ff0 65 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20  eSize*2/3)).    
33000 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
33010 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
33020 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74  +2+szNext == pBt
33030 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
33040 20 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28 20   );...      if( 
33050 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  (pPage->nOverflo
33060 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e  w>0 || (pPage->n
33070 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62  Free > pBt->usab
33080 6c 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a  leSize*2/3)) &&.
33090 20 20 20 20 20 20 20 20 20 20 28 70 4c 65 61 66            (pLeaf
330a0 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
330b0 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
330c0 6c 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20  leSize*2/3).    
330d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
330e0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
330f0 61 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74 65  aken if the inte
33100 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77  rnal node is now
33110 20 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f 77   either overflow
33120 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ing.        ** o
33130 72 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20  r underfull and 
33140 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69  the leaf node wi
33150 6c 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 20  ll be underfull 
33160 61 66 74 65 72 20 74 68 65 20 6a 75 73 74 20 63  after the just c
33170 65 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ell .        ** 
33180 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69 6e  copied to the in
33190 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64  ternal node is d
331a0 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e 20  eleted from it. 
331b0 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61  This is a specia
331c0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  l.        ** cas
331d0 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  e because the ca
331e0 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20  ll to balance() 
331f0 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20 69  to correct the i
33200 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20  nternal node.   
33210 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e       ** may chan
33220 67 65 20 74 68 65 20 74 72 65 65 20 73 74 72 75  ge the tree stru
33230 63 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c 69  cture and invali
33240 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
33250 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
33260 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61  the leafCur.apPa
33270 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72  ge[] and leafCur
33280 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 2c  .aiIdx[] arrays,
33290 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 20   which will be. 
332a0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62         ** used b
332b0 79 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  y the balance() 
332c0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72 72  required to corr
332d0 65 63 74 20 74 68 65 20 75 6e 64 65 72 66 75 6c  ect the underful
332e0 6c 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a  l leaf.        *
332f0 2a 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  * node..        
33300 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
33310 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 69  e formula used i
33320 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
33330 20 61 62 6f 76 65 20 61 72 65 20 62 61 73 65 64   above are based
33340 20 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20 20   on facets of.  
33350 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
33360 69 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20  ite file-format 
33370 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e  that do not chan
33380 67 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20  ge over time..  
33390 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
333a0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
333b0 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73  ->nFree==pBt->us
333c0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29  ableSize*2/3+1 )
333d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
333e0 73 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e  se( pLeafPage->n
333f0 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70  Free+2+szNext==p
33400 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
33410 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  /3+1 );.        
33420 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
33430 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 20  d = 1;.      }  
33440 20 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69 66        ..      if
33450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33460 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
33470 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
33480 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
33490 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
334a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
334b0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
334c0 70 50 61 67 65 2c 20 69 64 78 29 2c 20 70 67 6e  pPage, idx), pgn
334d0 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  oChild);.       
334e0 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
334f0 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
33500 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63   0 );.        rc
33510 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
33520 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
33530 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33540 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75 72  TE_OK && leafCur
33550 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20  sorInvalid ){.  
33560 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 61        /* The lea
33570 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e  f-node is now un
33580 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74  derfull and so t
33590 68 65 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f  he tree needs to
335a0 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
335b0 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65  rebalanced. Howe
335c0 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63 65  ver, the balance
335d0 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  () operation on 
335e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20  the internal.   
335f0 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f       ** node abo
33600 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64 69  ve may have modi
33610 66 69 65 64 20 74 68 65 20 73 74 72 75 63 74 75  fied the structu
33620 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65  re of the B-Tree
33630 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
33640 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  so the current c
33650 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66 43  ontents of leafC
33660 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  ur.apPage[] and 
33670 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a  leafCur.aiIdx[].
33680 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e          ** may n
33690 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 20  ot be trusted.. 
336a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
336b0 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    ** It is not p
336c0 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79 20  ossible to copy 
336d0 74 68 65 20 61 6e 63 65 73 74 72 79 20 66 72 6f  the ancestry fro
336e0 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65 20 73  m pCur, as the s
336f0 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ame.        ** b
33700 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68 61  alance() call ha
33710 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74 68  s invalidated th
33720 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d  e pCur->apPage[]
33730 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20 20   and aiIdx[].   
33740 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20       ** arrays. 
33750 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
33760 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20      ** The call 
33770 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  to saveCursorPos
33780 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e  ition() below in
33790 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20 74  ternally saves t
337a0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b  he .        ** k
337b0 65 79 20 74 68 61 74 20 6c 65 61 66 43 75 72 20  ey that leafCur 
337c0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
337d0 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e  nting to. Curren
337e0 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20 20  tly, there.     
337f0 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f     ** are two co
33800 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65 79  pies of that key
33810 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20 6f   in the tree - o
33820 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  ne here on the l
33830 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eaf.        ** p
33840 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73  age and one on s
33850 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ome internal nod
33860 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20 54  e in the tree. T
33870 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20  he copy on.     
33880 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e     ** the leaf n
33890 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 74 68  ode is always th
338a0 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74 72  e next key in tr
338b0 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20 74  ee-order after t
338c0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
338d0 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  opy on the inter
338e0 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68  nal node. So, th
338f0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
33900 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20 20  3BtreeNext().   
33910 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65       ** calls re
33920 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
33930 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20 74  ion() to point t
33940 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
33950 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a 2a   copy.        **
33960 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 69   stored on the i
33970 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68  nternal node, th
33980 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20 74  en advances to t
33990 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20  he next entry,. 
339a0 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20         ** which 
339b0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
339c0 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65  e copy of the ke
339d0 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  y on the interna
339e0 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  l node..        
339f0 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20 6c  ** Net effect: l
33a00 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74 69  eafCur is pointi
33a10 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  ng back to the d
33a20 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20 20  uplicate cell.  
33a30 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e 65        ** that ne
33a40 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eds to be remove
33a50 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66 43  d, and the leafC
33a60 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a  ur.apPage[] and.
33a70 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66 43          ** leafC
33a80 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79  ur.aiIdx[] array
33a90 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 20  s are correct.. 
33aa0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33ab0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f    VVA_ONLY( Pgno
33ac0 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61   leafPgno = pLea
33ad0 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  fPage->pgno );. 
33ae0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
33af0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26  CursorPosition(&
33b00 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20 20  leafCur);.      
33b10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
33b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
33b40 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c  eeNext(&leafCur,
33b50 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
33b60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c      }.        pL
33b70 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75  eafPage = leafCu
33b80 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72  r.apPage[leafCur
33b90 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 20  .iPage];.       
33ba0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
33bb0 49 54 45 5f 4f 4b 20 7c 7c 20 70 4c 65 61 66 50  ITE_OK || pLeafP
33bc0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50  age->pgno==leafP
33bd0 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 61  gno );.        a
33be0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
33bf0 45 5f 4f 4b 20 7c 7c 20 6c 65 61 66 43 75 72 2e  E_OK || leafCur.
33c00 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50  aiIdx[leafCur.iP
33c10 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  age]==0 );.     
33c20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 53 51   }..      if( SQ
33c30 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20  LITE_OK==rc.    
33c40 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d     && SQLITE_OK=
33c50 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
33c60 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50 61  gerWrite(pLeafPa
33c70 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20  ge->pDbPage)) . 
33c80 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
33c90 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50 61  dropCell(pLeafPa
33ca0 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b 0a  ge, 0, szNext);.
33cb0 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59          VVA_ONLY
33cc0 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53  ( leafCur.pagesS
33cd0 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20  huffled = 0 );. 
33ce0 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
33cf0 6e 63 65 28 26 6c 65 61 66 43 75 72 2c 20 30 29  nce(&leafCur, 0)
33d00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
33d10 28 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61  ( leafCursorInva
33d20 6c 69 64 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e  lid || !leafCur.
33d30 70 61 67 65 73 53 68 75 66 66 6c 65 64 0a 20 20  pagesShuffled.  
33d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d60 20 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67 65 73   || !pCur->pages
33d70 53 68 75 66 66 6c 65 64 20 29 3b 0a 20 20 20 20  Shuffled );.    
33d80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
33d90 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
33da0 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61  eTempCursor(&lea
33db0 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fCur);.  }else{.
33dc0 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
33dd0 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
33de0 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ete from leaf %d
33df0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72  \n",.       pCur
33e00 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
33e10 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72  e->pgno));.    r
33e20 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61  c = dropCell(pPa
33e30 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ge, idx, cellSiz
33e40 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
33e50 6c 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  l));.    if( rc=
33e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33e70 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
33e80 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
33e90 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
33ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33eb0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
33ec0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
33ed0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
33ee0 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20 74  te a new BTree t
33ef0 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74  able.  Write int
33f00 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70  o *piTable the p
33f10 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
33f20 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
33f30 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
33f40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65  ..**.** The type
33f50 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74 65   of type is dete
33f60 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c  rmined by the fl
33f70 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20  ags parameter.  
33f80 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  Only the.** foll
33f90 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20  owing values of 
33fa0 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65 6e  flags are curren
33fb0 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68  tly in use.  Oth
33fc0 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a  er values for.**
33fd0 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74   flags might not
33fe0 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   work:.**.**    
33ff0 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54   BTREE_INTKEY|BT
34000 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20  REE_LEAFDATA    
34010 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61   Used for SQL ta
34020 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64 20  bles with rowid 
34030 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45  keys.**     BTRE
34040 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20  E_ZERODATA      
34050 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 64              Used
34060 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73   for SQL indices
34070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
34080 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
34090 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
340a0 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
340b0 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  s){.  BtShared *
340c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
340d0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
340e0 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b    Pgno pgnoRoot;
340f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
34100 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
34110 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
34120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
34130 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
34140 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
34150 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
34160 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66  readOnly );..#if
34170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34180 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20  AUTOVACUUM.  rc 
34190 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
341a0 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c  age(pBt, &pRoot,
341b0 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30   &pgnoRoot, 1, 0
341c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
341d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
341e0 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  }.#else.  if( pB
341f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
34200 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f  .    Pgno pgnoMo
34210 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ve;      /* Move
34220 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20   a page here to 
34230 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
34240 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  e root-page */. 
34250 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
34260 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61  eMove; /* The pa
34270 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a  ge to move to. *
34280 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69  /..    /* Creati
34290 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d  ng a new table m
342a0 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75  ay probably requ
342b0 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78  ire moving an ex
342c0 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a  isting database.
342d0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72      ** to make r
342e0 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20  oom for the new 
342f0 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65  tables root page
34300 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70  . In case this p
34310 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a  age turns.    **
34320 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76   out to be an ov
34330 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c  erflow page, del
34340 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77  ete all overflow
34350 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73   page-map caches
34360 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20  .    ** held by 
34370 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20  open cursors..  
34380 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64    */.    invalid
34390 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
343a0 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f  che(pBt);..    /
343b0 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  * Read the value
343c0 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d   of meta[3] from
343d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
343e0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65   determine where
343f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
34400 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
34410 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f   table should go
34420 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65  . meta[3] is the
34430 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
34440 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  ge.    ** create
34450 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65  d so far, so the
34460 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69   new root-page i
34470 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20  s (meta[3]+1).. 
34480 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
34490 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
344a0 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f  ta(p, 4, &pgnoRo
344b0 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ot);.    if( rc!
344c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
344d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
344e0 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f     }.    pgnoRoo
344f0 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  t++;..    /* The
34500 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d   new root-page m
34510 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61  ay not be alloca
34520 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72  ted on a pointer
34530 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68  -map page, or th
34540 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47  e.    ** PENDING
34550 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20  _BYTE page..    
34560 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67  */.    while( pg
34570 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50  noRoot==PTRMAP_P
34580 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52  AGENO(pBt, pgnoR
34590 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  oot) ||.        
345a0 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e  pgnoRoot==PENDIN
345b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
345c0 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f   ){.      pgnoRo
345d0 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ot++;.    }.    
345e0 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74  assert( pgnoRoot
345f0 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  >=3 );..    /* A
34600 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20  llocate a page. 
34610 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75  The page that cu
34620 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20  rrently resides 
34630 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c  at pgnoRoot will
34640 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64  .    ** be moved
34650 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
34660 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74  d page (unless t
34670 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
34680 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a  e happens.    **
34690 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67   to reside at pg
346a0 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a  noRoot)..    */.
346b0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
346c0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
346d0 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e  &pPageMove, &pgn
346e0 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c  oMove, pgnoRoot,
346f0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   1);.    if( rc!
34700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34710 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34720 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67     }..    if( pg
34730 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74  noMove!=pgnoRoot
34740 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e   ){.      /* pgn
34750 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67  oRoot is the pag
34760 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  e that will be u
34770 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  sed for the root
34780 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a  -page of.      *
34790 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
347a0 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72  (assuming an err
347b0 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72  or did not occur
347c0 29 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a 20  ). But we were. 
347d0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
347e0 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72  d pgnoMove. If r
347f0 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66  equired (i.e. if
34800 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f   it was not allo
34810 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  cated.      ** b
34820 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20  y extending the 
34830 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65  file), the curre
34840 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73 69 74  nt page at posit
34850 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20  ion pgnoMove.   
34860 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
34870 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20   journaled..    
34880 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54    */.      u8 eT
34890 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ype;.      Pgno 
348a0 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20  iPtrPage;..     
348b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
348c0 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20  geMove);..      
348d0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  /* Move the page
348e0 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67   currently at pg
348f0 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f  noRoot to pgnoMo
34900 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ve. */.      rc 
34910 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
34920 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
34930 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
34940 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34960 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
34980 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
34990 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70   pgnoRoot, &eTyp
349a0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
349b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
349c0 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d  ITE_OK || eType=
349d0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
349e0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
349f0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
34a00 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34a10 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
34a20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
34a30 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
34a40 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
34a50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20  _ROOTPAGE );.   
34a60 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
34a70 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  !=PTRMAP_FREEPAG
34a80 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  E );.      rc = 
34a90 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
34aa0 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20  , pRoot, eType, 
34ab0 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f  iPtrPage, pgnoMo
34ac0 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  ve, 0);.      re
34ad0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
34ae0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  ;..      /* Obta
34af0 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20 70  in the page at p
34b00 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20  gnoRoot */.     
34b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
34b30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
34b40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34b50 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
34b60 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
34b70 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20  pRoot, 0);.     
34b80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34b90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
34ba0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
34bb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34bc0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
34bd0 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
34be0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34bf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34c00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
34c10 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
34c20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
34c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34c40 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d    pRoot = pPageM
34c50 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20  ove;.    } ..   
34c60 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
34c70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d  ointer-map and m
34c80 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74 68  eta-data with th
34c90 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
34ca0 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72  number. */.    r
34cb0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
34cc0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52  t, pgnoRoot, PTR
34cd0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29  MAP_ROOTPAGE, 0)
34ce0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
34cf0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34d00 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
34d10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
34d20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34d30 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
34d40 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29  (p, 4, pgnoRoot)
34d50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
34d60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34d70 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
34d80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
34d90 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ..  }else{.    r
34da0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
34db0 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
34dc0 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
34dd0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
34de0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
34df0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
34e00 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
34e10 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d  writeable(pRoot-
34e20 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 7a  >pDbPage) );.  z
34e30 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 66  eroPage(pRoot, f
34e40 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46 29  lags | PTF_LEAF)
34e50 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
34e60 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62  Unref(pRoot->pDb
34e70 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c  Page);.  *piTabl
34e80 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f  e = (int)pgnoRoo
34e90 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  t;.  return SQLI
34ea0 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
34eb0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
34ec0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
34ed0 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74  nt *piTable, int
34ee0 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
34ef0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
34f00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
34f10 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  = btreeCreateTab
34f20 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66  le(p, piTable, f
34f30 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
34f40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
34f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34f60 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67  *.** Erase the g
34f70 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  iven database pa
34f80 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63  ge and all its c
34f90 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e  hildren.  Return
34fa0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20  .** the page to 
34fb0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f  the freelist..*/
34fc0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
34fd0 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20  rDatabasePage(. 
34fe0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
34ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
35000 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74   BTree that cont
35010 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a  ains the table *
35020 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
35030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
35040 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61  e number to clea
35050 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50  r */.  int freeP
35060 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a 20  ageFlag,     /* 
35070 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20  Deallocate page 
35080 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  if true */.  int
35090 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20 20   *pnChange.){.  
350a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
350b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
350c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
350d0 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Cell;.  int i;..
350e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
350f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
35100 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
35110 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  ( pgno>pagerPage
35120 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
35130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35140 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
35150 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64  }..  rc = getAnd
35160 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
35170 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69  no, &pPage);.  i
35180 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
35190 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
351a0 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ut;.  for(i=0; i
351b0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
351c0 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d  ++){.    pCell =
351d0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
351e0 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50   i);.    if( !pP
351f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
35200 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
35210 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
35220 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
35230 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20  1, pnChange);.  
35240 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
35250 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
35260 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
35270 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
35280 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  l(pPage, pCell);
35290 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
352a0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
352b0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
352c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
352d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65   ){.    rc = cle
352e0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
352f0 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
35300 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20  age->aData[8]), 
35310 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20  1, pnChange);.  
35320 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
35330 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
35340 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69  e_out;.  }else i
35350 66 28 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a 20  f( pnChange ){. 
35360 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35370 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
35380 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50 61  *pnChange += pPa
35390 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20  ge->nCell;.  }. 
353a0 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61   if( freePageFla
353b0 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  g ){.    rc = fr
353c0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
353d0 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
353e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
353f0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
35400 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65  e))==0 ){.    ze
35410 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  roPage(pPage, pP
35420 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20  age->aData[0] | 
35430 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a  PTF_LEAF);.  }..
35440 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
35450 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  e_out:.  release
35460 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
35470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
35480 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  ** Delete all in
35490 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
354a0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
354b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
354c0 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65  iTable is.** the
354d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
354e0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
354f0 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68  table.  After th
35500 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
35510 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  ns,.** the root 
35520 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62  page is empty, b
35530 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e  ut still exists.
35540 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
35550 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
35560 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
35570 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
35580 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63  y open.** read c
35590 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
355a0 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65  ble.  Open write
355b0 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76   cursors are mov
355c0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f  ed to the.** roo
355d0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
355e0 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e 67  **.** If pnChang
355f0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
35600 68 65 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65  hen table iTable
35610 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 6b   must be an intk
35620 65 79 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a  ey table. The.**
35630 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 70   integer value p
35640 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 6e 43  ointed to by pnC
35650 68 61 6e 67 65 20 69 73 20 69 6e 63 72 65 6d 65  hange is increme
35660 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  nted by the numb
35670 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65 73  er of.** entries
35680 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
35690 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
356a0 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72  eeClearTable(Btr
356b0 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
356c0 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65  e, int *pnChange
356d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
356e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
356f0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
35700 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
35710 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
35720 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
35730 20 29 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20   );.  if( (rc = 
35740 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66  checkForReadConf
35750 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 2c  licts(p, iTable,
35760 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f   0, 1))!=SQLITE_
35770 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  OK ){.    /* not
35780 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
35790 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45  }else if( SQLITE
357a0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
357b0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69  llCursors(pBt, i
357c0 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20  Table, 0)) ){.  
357d0 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
357e0 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  do */.  }else{. 
357f0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
35800 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28  abasePage(pBt, (
35810 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20  Pgno)iTable, 0, 
35820 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a 20  pnChange);.  }. 
35830 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
35840 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
35850 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
35860 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  se all informati
35870 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e  on in a table an
35880 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f  d add the root o
35890 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a  f the table to.*
358a0 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  * the freelist. 
358b0 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f   Except, the roo
358c0 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70  t of the princip
358d0 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e  le table (the on
358e0 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20  e on.** page 1) 
358f0 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74  is never added t
35900 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
35910 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
35920 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
35930 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
35940 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
35950 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73   open.** cursors
35960 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   on the table..*
35970 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55  *.** If AUTOVACU
35980 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e  UM is enabled an
35990 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69 54  d the page at iT
359a0 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20  able is not the 
359b0 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67  last.** root pag
359c0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
359d0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
359e0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
359f0 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
35a00 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65  ase file is move
35a10 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20  d into the slot 
35a20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
35a30 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61  d by.** iTable a
35a40 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f  nd that last slo
35a50 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70  t formerly occup
35a60 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20  ied by the last 
35a70 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
35a80 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
35a90 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66  elist instead of
35aa0 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69   iTable.  In thi
35ab0 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f  s say, all.** ro
35ac0 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 70  ot pages are kep
35ad0 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  t at the beginni
35ae0 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
35af0 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a  se file, which.*
35b00 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  * is necessary f
35b10 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f  or AUTOVACUUM to
35b20 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70   work right.  *p
35b30 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
35b40 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75   the .** page nu
35b50 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20 74  mber that used t
35b60 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f  o be the last ro
35b70 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  ot page in the f
35b80 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ile before.** th
35b90 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70  e move.  If no p
35ba0 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20  age gets moved, 
35bb0 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20  *piMoved is set 
35bc0 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73  to 0..** The las
35bd0 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72  t root page is r
35be0 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b  ecorded in meta[
35bf0 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  3] and the value
35c00 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69   of.** meta[3] i
35c10 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 69  s updated by thi
35c20 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a  s procedure..*/.
35c30 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
35c40 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20  DropTable(Btree 
35c50 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
35c60 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
35c70 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
35c80 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
35c90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
35ca0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
35cb0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
35cc0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
35cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
35ce0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
35cf0 49 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20  ITE );..  /* It 
35d00 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72  is illegal to dr
35d10 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e  op a table if an
35d20 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70  y cursors are op
35d30 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  en on the.  ** d
35d40 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
35d50 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f   because in auto
35d60 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65  -vacuum mode the
35d70 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a   backend may.  *
35d80 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61  * need to move a
35d90 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65  nother root-page
35da0 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c   to fill a gap l
35db0 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74  eft by the delet
35dc0 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  ed.  ** root pag
35dd0 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75  e. If an open cu
35de0 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74  rsor was using t
35df0 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c  his page a probl
35e00 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f  em would .  ** o
35e10 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ccur..  */.  if(
35e20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pBt->pCursor ){
35e30 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
35e40 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
35e50 3e 64 62 2c 20 70 42 74 2d 3e 70 43 75 72 73 6f  >db, pBt->pCurso
35e60 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a  r->pBtree->db);.
35e70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35e80 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
35e90 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  ACHE;.  }..  rc 
35ea0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
35eb0 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
35ec0 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c  )iTable, &pPage,
35ed0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
35ee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
35ef0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
35f00 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62  earTable(p, iTab
35f10 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  le, 0);.  if( rc
35f20 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
35f30 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
35f40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
35f50 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a    *piMoved = 0;.
35f60 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20  .  if( iTable>1 
35f70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
35f80 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
35f90 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
35fa0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
35fb0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
35fc0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
35fd0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
35fe0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d   ){.      Pgno m
35ff0 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
36000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
36010 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
36020 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a   &maxRootPgno);.
36030 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36050 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
36060 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
36070 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36080 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  }..      if( iTa
36090 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f  ble==maxRootPgno
360a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
360b0 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
360c0 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65  g dropped is the
360d0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
360e0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
360f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
36100 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
36110 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f  ase, put the roo
36120 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  t page on the fr
36130 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  ee list. .      
36140 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
36150 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
36160 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
36170 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
36180 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
36190 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
361a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
361b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
361c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
361d0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
361e0 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20  ng dropped does 
361f0 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72  not have the lar
36200 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
36210 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
36220 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
36230 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61  . So move the pa
36240 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74  ge that does int
36250 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
36260 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  * gap left by th
36270 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70  e deleted root-p
36280 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  age..        */.
36290 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
362a0 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20  *pMove;.        
362b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
362c0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
362d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
362e0 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
362f0 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
36300 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
36310 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36320 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
36330 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
36340 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
36350 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
36360 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
36370 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c  PAGE, 0, iTable,
36380 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c   0);.        rel
36390 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
363a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
363b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
363c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
363d0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
363e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
363f0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
36400 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
36410 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  &pMove, 0);.    
36420 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36440 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
36450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36460 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d  rc = freePage(pM
36470 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ove);.        re
36480 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
36490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
364a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
364b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
364c0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
364d0 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d        *piMoved =
364e0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
364f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
36500 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78  Set the new 'max
36510 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75  -root-page' valu
36520 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
36530 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20  e header. This. 
36540 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f       ** is the o
36550 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e  ld value less on
36560 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65  e, less one more
36570 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   if that happens
36580 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20   to.      ** be 
36590 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  a root-page numb
365a0 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61  er, less one aga
365b0 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68  in if that is th
365c0 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49  e.      ** PENDI
365d0 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20  NG_BYTE_PAGE..  
365e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78      */.      max
365f0 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
36600 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
36610 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
36620 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
36630 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
36640 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
36650 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
36660 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  o==PTRMAP_PAGENO
36670 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
36680 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  o) ){.        ma
36690 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
366a0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
366b0 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d  t( maxRootPgno!=
366c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
366d0 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20  E(pBt) );..     
366e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
366f0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
36700 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  4, maxRootPgno);
36710 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36720 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
36730 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
36740 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
36750 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
36760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
36770 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  f sqlite3BtreeDr
36780 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c  opTable was call
36790 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ed on page 1. */
367a0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
367b0 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  age, PTF_INTKEY|
367c0 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20  PTF_LEAF );.    
367d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
367e0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
367f0 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c   rc;  .}.int sql
36800 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
36810 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
36820 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
36830 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
36840 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
36850 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
36860 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
36870 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76  p, iTable, piMov
36880 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ed);.  sqlite3Bt
36890 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
368a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
368b0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74  .** Read the met
368c0 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  a-information ou
368d0 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
368e0 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  file.  Meta[0].*
368f0 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
36900 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63 75  of free pages cu
36910 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64  rrently in the d
36920 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31  atabase.  Meta[1
36930 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74  ].** through met
36940 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61  a[15] are availa
36950 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 68  ble for use by h
36960 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d  igher layers.  M
36970 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61  eta[0].** is rea
36980 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65  d-only, the othe
36990 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  rs are read/writ
369a0 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63  e..** .** The sc
369b0 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65  hema layer numbe
369c0 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64  rs meta values d
369d0 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20  ifferently.  At 
369e0 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61  the schema.** la
369f0 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65 74  yer (and the Set
36a00 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43  Cookie and ReadC
36a10 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74  ookie opcodes) t
36a20 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
36a30 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f  free pages is no
36a40 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43  t visible.  So C
36a50 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20  ookie[0] is the 
36a60 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e  same as Meta[1].
36a70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
36a80 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72 65  treeGetMeta(Btre
36a90 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
36aa0 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62  32 *pMeta){.  Db
36ab0 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 3d 20  Page *pDbPage = 
36ac0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
36ad0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
36ae0 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  1;.  BtShared *p
36af0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
36b00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
36b10 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  r(p);..  /* Read
36b20 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20  ing a meta-data 
36b30 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61  value requires a
36b40 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
36b50 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a  ge 1 (and hence.
36b60 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f    ** the sqlite_
36b70 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65  master table. We
36b80 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20   grab this lock 
36b90 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
36ba0 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f  ether or.  ** no
36bb0 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61  t the SQLITE_Rea
36bc0 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
36bd0 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61  g is set (the ta
36be0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
36bf0 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65  ge.  ** 1 is tre
36c00 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61  ated as a specia
36c10 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79 53  l case by queryS
36c20 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
36c30 6f 63 6b 28 29 0a 20 20 2a 2a 20 61 6e 64 20 73  ock().  ** and s
36c40 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
36c50 6c 65 4c 6f 63 6b 28 29 29 2e 0a 20 20 2a 2f 0a  leLock())..  */.
36c60 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
36c70 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
36c80 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b  (p, 1, READ_LOCK
36c90 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
36ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
36cb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
36cc0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  p);.    return r
36cd0 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
36ce0 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
36cf0 3d 31 35 20 29 3b 0a 20 20 69 66 28 20 70 42 74  =15 );.  if( pBt
36d00 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20  ->pPage1 ){.    
36d10 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20 69 73  /* The b-tree is
36d20 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 69 6e 67   already holding
36d30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
36d40 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
36d50 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
36d60 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  le. In this case
36d70 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6d 65   the required me
36d80 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 63 61  ta-data value ca
36d90 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
36da0 6c 79 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  ly.    ** from t
36db0 68 65 20 70 61 67 65 20 64 61 74 61 20 6f 66 20  he page data of 
36dc0 74 68 69 73 20 72 65 66 65 72 65 6e 63 65 2e 20  this reference. 
36dd0 54 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79  This is slightly
36de0 20 66 61 73 74 65 72 20 74 68 61 6e 0a 20 20 20   faster than.   
36df0 20 2a 2a 20 72 65 71 75 65 73 74 69 6e 67 20 61   ** requesting a
36e00 20 6e 65 77 20 72 65 66 65 72 65 6e 63 65 20 66   new reference f
36e10 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
36e20 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  yer..    */.    
36e30 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  pP1 = (unsigned 
36e40 63 68 61 72 20 2a 29 70 42 74 2d 3e 70 50 61 67  char *)pBt->pPag
36e50 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 7d 65 6c  e1->aData;.  }el
36e60 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62  se{.    /* The b
36e70 2d 74 72 65 65 20 64 6f 65 73 20 6e 6f 74 20 68  -tree does not h
36e80 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ave a reference 
36e90 74 6f 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  to page 1 of the
36ea0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
36eb0 20 20 20 20 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e      ** Obtain on
36ec0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
36ed0 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20   layer..    */. 
36ee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36ef0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
36f00 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65  ger, 1, &pDbPage
36f10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
36f30 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
36f40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
36f50 20 20 7d 0a 20 20 20 20 70 50 31 20 3d 20 28 75    }.    pP1 = (u
36f60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
36f70 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
36f80 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ta(pDbPage);.  }
36f90 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34  .  *pMeta = get4
36fa0 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69  byte(&pP1[36 + i
36fb0 64 78 2a 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66  dx*4]);..  /* If
36fc0 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6e   the b-tree is n
36fd0 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  ot holding a ref
36fe0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
36ff0 2c 20 74 68 65 6e 20 6f 6e 65 20 77 61 73 20 0a  , then one was .
37000 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66    ** requested f
37010 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
37020 79 65 72 20 69 6e 20 74 68 65 20 61 62 6f 76 65  yer in the above
37030 20 62 6c 6f 63 6b 2e 20 52 65 6c 65 61 73 65 20   block. Release 
37040 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  it now..  */.  i
37050 66 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  f( !pBt->pPage1 
37060 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
37070 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
37080 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
37090 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20  autovacuumed is 
370a0 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73  disabled in this
370b0 20 62 75 69 6c 64 20 62 75 74 20 77 65 20 61 72   build but we ar
370c0 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a  e trying to .  *
370d0 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f  * access an auto
370e0 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61 73  vacuumed databas
370f0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65  e, then make the
37100 20 64 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e   database readon
37110 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ly. .  */.#ifdef
37120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
37130 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64  OVACUUM.  if( id
37140 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30  x==4 && *pMeta>0
37150 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   ) pBt->readOnly
37160 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 1;.#endif..  
37170 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 63  /* If there is c
37180 75 72 72 65 6e 74 6c 79 20 61 6e 20 6f 70 65 6e  urrently an open
37190 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 67 72   transaction, gr
371a0 61 62 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a  ab a read-lock .
371b0 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 20 6f    ** on page 1 o
371c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
371d0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
371e0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
371f0 68 61 74 0a 20 20 2a 2a 20 6e 6f 20 6f 74 68 65  hat.  ** no othe
37200 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  r connection can
37210 20 6d 6f 64 69 66 79 20 74 68 65 20 6d 65 74 61   modify the meta
37220 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
37230 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 64   from.  ** the d
37240 61 74 61 62 61 73 65 20 75 6e 74 69 6c 20 74 68  atabase until th
37250 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
37260 20 63 6f 6e 63 6c 75 64 65 64 2e 0a 20 20 2a 2f   concluded..  */
37270 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
37280 73 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  s>0 ){.    rc = 
37290 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
372a0 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45  bleLock(p, 1, RE
372b0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20  AD_LOCK);.  }.  
372c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
372d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
372e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
372f0 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69  e meta-informati
37300 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  on back into the
37310 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61   database.  Meta
37320 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f  [0] is.** read-o
37330 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20  nly and may not 
37340 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69  be written..*/.i
37350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55  nt sqlite3BtreeU
37360 70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20  pdateMeta(Btree 
37370 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  *p, int idx, u32
37380 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61   iMeta){.  BtSha
37390 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
373a0 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
373b0 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72  ar *pP1;.  int r
373c0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  c;.  assert( idx
373d0 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29  >=1 && idx<=15 )
373e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
373f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
37400 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
37410 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
37420 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
37430 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31  age1!=0 );.  pP1
37440 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   = pBt->pPage1->
37450 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
37460 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37470 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
37480 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
37490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
374a0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 31 5b    put4byte(&pP1[
374b0 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65  36 + idx*4], iMe
374c0 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ta);.#ifndef SQL
374d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
374e0 55 55 4d 0a 20 20 20 20 69 66 28 20 69 64 78 3d  UUM.    if( idx=
374f0 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =7 ){.      asse
37500 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
37510 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20  uum || iMeta==0 
37520 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
37530 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65   iMeta==0 || iMe
37540 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  ta==1 );.      p
37550 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
37560 20 28 75 38 29 69 4d 65 74 61 3b 0a 20 20 20 20   (u8)iMeta;.    
37570 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  }.#endif.  }.  s
37580 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
37590 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
375a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
375b0 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20  n the flag byte 
375c0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
375d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
375e0 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
375f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
37600 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74  nting to..*/.int
37610 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61   sqlite3BtreeFla
37620 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  gs(BtCursor *pCu
37630 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
37640 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52  hat about CURSOR
37650 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
37660 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65  te? Probably nee
37670 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72  d to call.  ** r
37680 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
37690 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a  tion() here..  *
376a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
376b0 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43 75 72  ge;.  restoreCur
376c0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
376d0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
376e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
376f0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
37700 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
37710 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
37720 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
37730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37740 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42  e->pBt==pCur->pB
37750 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  t );.  return pP
37760 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
37770 2d 3e 68 64 72 4f 66 66 73 65 74 5d 3b 0a 7d 0a  ->hdrOffset];.}.
37780 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37790 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
377a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
377b0 61 72 67 75 6d 65 6e 74 2c 20 70 43 75 72 2c 20  argument, pCur, 
377c0 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  is a cursor open
377d0 65 64 20 6f 6e 20 73 6f 6d 65 20 62 2d 74 72 65  ed on some b-tre
377e0 65 2e 20 43 6f 75 6e 74 20 74 68 65 0a 2a 2a 20  e. Count the.** 
377f0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
37800 73 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  s in the b-tree 
37810 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 72 65  and write the re
37820 73 75 6c 74 20 74 6f 20 2a 70 6e 45 6e 74 72 79  sult to *pnEntry
37830 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
37840 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
37850 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
37860 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  s successfully e
37870 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 4f 74 68  xecuted. .** Oth
37880 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
37890 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
378a0 65 64 20 28 69 2e 65 2e 20 61 6e 20 49 4f 20 65  ed (i.e. an IO e
378b0 72 72 6f 72 20 6f 72 20 64 61 74 61 62 61 73 65  rror or database
378c0 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 29 20  .** corruption) 
378d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
378e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
378f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37900 42 74 72 65 65 43 6f 75 6e 74 28 42 74 43 75 72  BtreeCount(BtCur
37910 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
37920 70 6e 45 6e 74 72 79 29 7b 0a 20 20 69 36 34 20  pnEntry){.  i64 
37930 6e 45 6e 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nEntry = 0;     
37940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37950 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
37960 75 72 6e 20 69 6e 20 2a 70 6e 45 6e 74 72 79 20  urn in *pnEntry 
37970 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
37980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
379a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 72 63  urn code */.  rc
379b0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
379c0 75 72 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73  ur);..  /* Unles
379d0 73 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  s an error occur
379e0 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
379f0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 65 20 69   loop runs one i
37a00 74 65 72 61 74 69 6f 6e 20 66 6f 72 20 65 61 63  teration for eac
37a10 68 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  h.  ** page in t
37a20 68 65 20 42 2d 54 72 65 65 20 73 74 72 75 63 74  he B-Tree struct
37a30 75 72 65 20 28 6e 6f 74 20 69 6e 63 6c 75 64 69  ure (not includi
37a40 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
37a50 73 29 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  s). .  */.  whil
37a60 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
37a70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78   ){.    int iIdx
37a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37aa0 64 65 78 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64  dex of child nod
37ab0 65 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20  e in parent */. 
37ac0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
37ad0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
37ae0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
37af0 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
37b00 72 65 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ree */..    /* I
37b10 66 20 74 68 69 73 20 69 73 20 61 20 6c 65 61 66  f this is a leaf
37b20 20 70 61 67 65 20 6f 72 20 74 68 65 20 74 72 65   page or the tre
37b30 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 2d  e is not an int-
37b40 6b 65 79 20 74 72 65 65 2c 20 74 68 65 6e 20 0a  key tree, then .
37b50 20 20 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65      ** this page
37b60 20 63 6f 6e 74 61 69 6e 73 20 63 6f 75 6e 74 61   contains counta
37b70 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 49 6e 63  ble entries. Inc
37b80 72 65 6d 65 6e 74 20 74 68 65 20 65 6e 74 72 79  rement the entry
37b90 20 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20   counter.    ** 
37ba0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 20 20 20  accordingly..   
37bb0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 20 3d 20   */.    pPage = 
37bc0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
37bd0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
37be0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c  f( pPage->leaf |
37bf0 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | !pPage->intKey
37c00 20 29 7b 0a 20 20 20 20 20 20 6e 45 6e 74 72 79   ){.      nEntry
37c10 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   += pPage->nCell
37c20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
37c30 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
37c40 6e 6f 64 65 2e 20 54 68 69 73 20 6c 6f 6f 70 20  node. This loop 
37c50 6e 61 76 69 67 61 74 65 73 20 74 68 65 20 63 75  navigates the cu
37c60 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
37c70 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74  .    ** points t
37c80 6f 20 74 68 65 20 66 69 72 73 74 20 69 6e 74 65  o the first inte
37c90 72 69 6f 72 20 63 65 6c 6c 20 74 68 61 74 20 69  rior cell that i
37ca0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
37cb0 70 61 72 65 6e 74 20 6f 66 0a 20 20 20 20 2a 2a  parent of.    **
37cc0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
37cd0 6e 20 74 68 65 20 74 72 65 65 20 74 68 61 74 20  n the tree that 
37ce0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
37cf0 20 76 69 73 69 74 65 64 2e 20 54 68 65 0a 20 20   visited. The.  
37d00 20 20 2a 2a 20 70 43 75 72 2d 3e 61 69 49 64 78    ** pCur->aiIdx
37d10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 76 61  [pCur->iPage] va
37d20 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  lue is set to th
37d30 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 70  e index of the p
37d40 61 72 65 6e 74 20 63 65 6c 6c 0a 20 20 20 20 2a  arent cell.    *
37d50 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f  * of the page, o
37d60 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  r to the number 
37d70 6f 66 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  of cells in the 
37d80 70 61 67 65 20 69 66 20 74 68 65 20 6e 65 78 74  page if the next
37d90 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 6f 20   page.    ** to 
37da0 76 69 73 69 74 20 69 73 20 74 68 65 20 72 69 67  visit is the rig
37db0 68 74 2d 63 68 69 6c 64 20 6f 66 20 69 74 73 20  ht-child of its 
37dc0 70 61 72 65 6e 74 2e 0a 20 20 20 20 2a 2a 0a 20  parent..    **. 
37dd0 20 20 20 2a 2a 20 49 66 20 61 6c 6c 20 70 61 67     ** If all pag
37de0 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 68  es in the tree h
37df0 61 76 65 20 62 65 65 6e 20 76 69 73 69 74 65 64  ave been visited
37e00 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
37e10 4f 4b 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  OK to the.    **
37e20 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2f 0a   caller..    */.
37e30 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
37e40 65 61 66 20 29 7b 0a 20 20 20 20 20 20 64 6f 20  eaf ){.      do 
37e50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  {.        if( pC
37e60 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
37e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
37e80 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 62 2d   pages of the b-
37e90 74 72 65 65 20 68 61 76 65 20 62 65 65 6e 20 76  tree have been v
37ea0 69 73 69 74 65 64 2e 20 52 65 74 75 72 6e 20 73  isited. Return s
37eb0 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 2a 2f 0a  uccessfully. */.
37ec0 20 20 20 20 20 20 20 20 20 20 2a 70 6e 45 6e 74            *pnEnt
37ed0 72 79 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 20  ry = nEntry;.   
37ee0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
37ef0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
37f00 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
37f10 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72  e3BtreeMoveToPar
37f20 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
37f30 20 7d 77 68 69 6c 65 20 28 20 70 43 75 72 2d 3e   }while ( pCur->
37f40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
37f50 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]>=pCur->apPage
37f60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
37f70 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 20 20 70  Cell );..      p
37f80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
37f90 3e 69 50 61 67 65 5d 2b 2b 3b 0a 20 20 20 20 20  >iPage]++;.     
37fa0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
37fb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
37fc0 65 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  e];.    }..    /
37fd0 2a 20 44 65 73 63 65 6e 64 20 74 6f 20 74 68 65  * Descend to the
37fe0 20 63 68 69 6c 64 20 6e 6f 64 65 20 6f 66 20 74   child node of t
37ff0 68 65 20 63 65 6c 6c 20 74 68 61 74 20 74 68 65  he cell that the
38000 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
38010 79 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73  y .    ** points
38020 20 61 74 2e 20 54 68 69 73 20 69 73 20 74 68 65   at. This is the
38030 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 66 20   right-child if 
38040 28 69 49 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  (iIdx==pPage->nC
38050 65 6c 6c 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ell)..    */.   
38060 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69   iIdx = pCur->ai
38070 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
38080 3b 0a 20 20 20 20 69 66 28 20 69 49 64 78 3d 3d  ;.    if( iIdx==
38090 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
380a0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
380b0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
380c0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
380d0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
380e0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 7d  fset+8]));.    }
380f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
38100 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
38110 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
38120 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 49 64 78  Cell(pPage, iIdx
38130 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )));.    }.  }..
38140 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
38150 73 20 6f 63 63 75 72 72 65 64 2e 20 52 65 74 75  s occurred. Retu
38160 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
38170 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  . */.  return rc
38180 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
38190 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
381a0 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
381b0 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69  th a BTree.  Thi
381c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
381d0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
381e0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
381f0 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73  nly..*/.Pager *s
38200 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
38210 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
38220 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61  turn p->pBt->pPa
38230 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ger;.}..#ifndef 
38240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
38250 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
38260 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61  * Append a messa
38270 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ge to the error 
38280 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
38290 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
382a0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20  heckAppendMsg(. 
382b0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
382c0 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d  heck,.  char *zM
382d0 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sg1,.  const cha
382e0 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e  r *zFormat,.  ..
382f0 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
38300 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b  p;.  if( !pCheck
38310 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e  ->mxErr ) return
38320 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72  ;.  pCheck->mxEr
38330 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e  r--;.  pCheck->n
38340 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72  Err++;.  va_star
38350 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
38360 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72    if( pCheck->er
38370 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20  rMsg.nChar ){.  
38380 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
38390 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
383a0 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31  >errMsg, "\n", 1
383b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73  );.  }.  if( zMs
383c0 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g1 ){.    sqlite
383d0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
383e0 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
383f0 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d   zMsg1, -1);.  }
38400 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e  .  sqlite3VXPrin
38410 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d  tf(&pCheck->errM
38420 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20  sg, 1, zFormat, 
38430 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
38440 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  );.  if( pCheck-
38450 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46 61  >errMsg.mallocFa
38460 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43 68 65  iled ){.    pChe
38470 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ck->mallocFailed
38480 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 1;.