/ Hex Artifact Content
Login

Artifact b0ac995593edf809962b16b7bfa55455c2f31545:


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 31 31 20 32 30 30 39 2f 30  c,v 1.611 2009/0
0190: 36 2f 30 33 20 31 37 3a 32 36 3a 31 38 20 64 61  6/03 17:26:18 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 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23   (u16)nSize;.}.#
64b0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
64c0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
64d0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
64e0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
64f0: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
6500: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
6510: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
6520: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
6530: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6540: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
6550: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
6560: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
6570: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
6580: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6590: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
65a0: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
65b0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
65c0: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
65d0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
65e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
65f0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6600: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
6610: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43   u8 *pCell){.  C
6620: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
6630: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
6640: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
6650: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
6660: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
6670: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
6680: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
6690: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
66a0: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
66b0: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
66c0: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
66d0: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
66e0: 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c  o.nKey))>info.nL
66f0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f  ocal ){.    Pgno
6700: 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
6710: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
6720: 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65  erflow]);.    re
6730: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
6740: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
6750: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
6760: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
6770: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6780: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a  LITE_OK;.}./*.**
6790: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74   If the cell wit
67a0: 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e  h index iCell on
67b0: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
67c0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
67d0: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
67e0: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
67f0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
6800: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
6810: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
6820: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
6830: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66  int ptrmapPutOvf
6840: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
6850: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
6860: 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73  u8 *pCell;.  ass
6870: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6880: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
6890: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
68a0: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72  pCell = findOver
68b0: 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20  flowCell(pPage, 
68c0: 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  iCell);.  return
68d0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
68e0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
68f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
6900: 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65  * Defragment the
6910: 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c   page given.  Al
6920: 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65  l Cells are move
6930: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  d to the.** end 
6940: 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  of the page and 
6950: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69  all free space i
6960: 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  s collected into
6970: 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65   one.** big Free
6980: 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20  Blk that occurs 
6990: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68  in between the h
69a0: 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a  eader and cell.*
69b0: 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  * pointer array 
69c0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
69d0: 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74  tent area..*/.st
69e0: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
69f0: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
6a00: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
6a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6a20: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
6a30: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
6a40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6a50: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
6a60: 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20   of a i-th cell 
6a70: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20  */.  int addr;  
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
6aa0: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65  st byte after ce
6ab0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
6ac0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
6af0: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
6b00: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6b20: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
6b30: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
6b40: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
6b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
6b60: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
6b70: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
6b80: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
6b90: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
6ba0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
6bb0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
6bc0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
6bd0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
6be0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
6bf0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
6c00: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
6c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6c20: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
6c30: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
6c40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
6c50: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
6c60: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
6c70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
6c80: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
6c90: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
6ca0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61   content */..  a
6cb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
6cc0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
6cd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
6ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6cf0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
6d00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
6d10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
6d20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
6d30: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
6d40: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
6d50: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
6d60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6d70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6d80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
6d90: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  emp = sqlite3Pag
6da0: 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67  erTempSpace(pPag
6db0: 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  e->pBt->pPager);
6dc0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
6dd0: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
6de0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6df0: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
6e00: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
6e10: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
6e20: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
6e30: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
6e40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
6e50: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
6e60: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
6e70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
6e80: 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28  cbrk = get2byte(
6e90: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
6ea0: 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62   memcpy(&temp[cb
6eb0: 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d  rk], &data[cbrk]
6ec0: 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63  , usableSize - c
6ed0: 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75  brk);.  cbrk = u
6ee0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72  sableSize;.  for
6ef0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
6f00: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
6f10: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
6f20: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
6f30: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
6f40: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
6f50: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
6f60: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
6f70: 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 3d 75  );.    if( pc>=u
6f80: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
6f90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6fa0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6fb0: 20 20 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20     }.    size = 
6fc0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
6fd0: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
6fe0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
6ff0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 63 65  .    if( cbrk<ce
7000: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
7010: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
7020: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
7030: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7040: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
7050: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  }.    assert( cb
7060: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
7070: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 30 20 29  ize && cbrk>=0 )
7080: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
7090: 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b  ta[cbrk], &temp[
70a0: 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  pc], size);.    
70b0: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
70c0: 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73  cbrk);.  }.  ass
70d0: 65 72 74 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f  ert( cbrk>=cellO
70e0: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b  ffset+2*nCell );
70f0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7100: 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b  a[hdr+5], cbrk);
7110: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
7120: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
7130: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
7140: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72  r+7] = 0;.  addr
7150: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a   = cellOffset+2*
7160: 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28  nCell;.  memset(
7170: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20  &data[addr], 0, 
7180: 63 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73  cbrk-addr);.  as
7190: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
71a0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
71b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
71c0: 0a 20 20 69 66 28 20 63 62 72 6b 2d 61 64 64 72  .  if( cbrk-addr
71d0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
71e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
71f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7200: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7210: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7220: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
7230: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
7240: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
7250: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
7260: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
7270: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  rst argument. Re
7280: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
7290: 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
72a0: 5b 5d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 69  [] of the .** fi
72b0: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
72c0: 63 61 74 65 64 20 73 70 61 63 65 2e 20 0a 2a 2a  cated space. .**
72d0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
72e0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
72f0: 68 65 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  he space between
7300: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7310: 63 65 6c 6c 2d 6f 66 66 73 65 74 20 0a 2a 2a 20  cell-offset .** 
7320: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 73 74  array and the st
7330: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
7340: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20  content area is 
7350: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
7360: 79 74 65 73 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e  ytes.** in size.
7370: 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   So this routine
7380: 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
7390: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
73a0: 61 72 65 20 61 6c 72 65 61 64 79 20 36 30 20 6f  are already 60 o
73b0: 72 20 6d 6f 72 65 20 62 79 74 65 73 20 6f 66 20  r more bytes of 
73c0: 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 69 6e  fragments within
73d0: 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 74 68   the page,.** th
73e0: 65 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67  e page is defrag
73f0: 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20 72 65  mented before re
7400: 74 75 72 6e 69 6e 67 2e 20 49 66 20 74 68 69 73  turning. If this
7410: 20 77 65 72 65 20 6e 6f 74 20 64 6f 6e 65 20 74   were not done t
7420: 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 68 61  here.** is a cha
7430: 6e 63 65 20 74 68 61 74 20 74 68 65 20 6e 75 6d  nce that the num
7440: 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65  ber of fragmente
7450: 64 20 62 79 74 65 73 20 63 6f 75 6c 64 20 65 76  d bytes could ev
7460: 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 6f 76 65  entually .** ove
7470: 72 66 6c 6f 77 20 74 68 65 20 73 69 6e 67 6c 65  rflow the single
7480: 2d 62 79 74 65 20 66 69 65 6c 64 20 6f 66 20 74  -byte field of t
7490: 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 69  he page-header i
74a0: 6e 20 77 68 69 63 68 20 74 68 69 73 20 76 61 6c  n which this val
74b0: 75 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 2e  ue.** is stored.
74c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
74d0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
74e0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
74f0: 20 6e 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74   nByte){.  const
7500: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
7510: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
7520: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
7530: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
7540: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
7550: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
7560: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
7570: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
7580: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
7590: 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20   int nFrag;     
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
75c0: 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  of fragmented by
75d0: 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a  tes on pPage */.
75e0: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 0a 20 20    int top;.  .  
75f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7600: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
7610: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7620: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
7630: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
7640: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7650: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7660: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7670: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
7680: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
7690: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
76a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
76b0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
76c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
76d0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
76e0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
76f0: 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20   that the space 
7700: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
7710: 2d 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 6e  -offset array an
7720: 64 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c  d the .  ** cell
7730: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73  -content area is
7740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 42   greater than nB
7750: 79 74 65 20 62 79 74 65 73 2e 0a 20 20 2a 2f 0a  yte bytes..  */.
7760: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
7770: 3c 3d 20 28 0a 20 20 20 20 20 20 67 65 74 32 62  <= (.      get2b
7780: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7790: 29 2d 28 68 64 72 2b 38 2b 28 70 50 61 67 65 2d  )-(hdr+8+(pPage-
77a0: 3e 6c 65 61 66 3f 30 3a 34 29 2b 32 2a 67 65 74  >leaf?0:4)+2*get
77b0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
77c0: 33 5d 29 29 0a 20 20 29 29 3b 0a 0a 20 20 70 50  3])).  ));..  pP
77d0: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
77e0: 31 36 29 6e 42 79 74 65 3b 0a 20 20 6e 46 72 61  16)nByte;.  nFra
77f0: 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b  g = data[hdr+7];
7800: 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30  .  if( nFrag>=60
7810: 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65   ){.    defragme
7820: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
7830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
7840: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
7850: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
7860: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
7870: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
7880: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
7890: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
78a0: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
78b0: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
78c0: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
78d0: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
78e0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
78f0: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
7900: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
7910: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
7920: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
7930: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
7940: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
7950: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
7960: 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74  t size = get2byt
7970: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 20  e(&data[pc+2]); 
7980: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66      /* Size of f
7990: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ree slot */.    
79a0: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
79b0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
79c0: 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74   x = size - nByt
79d0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  e;.        if( x
79e0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
79f0: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
7a00: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
7a10: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
7a20: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
7a30: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
7a40: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
7a50: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
7a60: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
7a70: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
7a80: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
7a90: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
7aa0: 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20   = (u8)(nFrag + 
7ab0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
7ac0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
7ad0: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
7ae0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
7af0: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
7b00: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
7b10: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
7b20: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
7b30: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
7b40: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
7b50: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
7b60: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
7b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7b80: 72 65 74 75 72 6e 20 70 63 20 2b 20 78 3b 0a 20  return pc + x;. 
7b90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7ba0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7bb0: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
7bc0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
7bd0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
7be0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
7bf0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
7c00: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
7c10: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7c20: 61 5b 68 64 72 2b 35 5d 29 20 2d 20 6e 42 79 74  a[hdr+5]) - nByt
7c30: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
7c40: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
7c50: 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a  ;.  return top;.
7c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7c70: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
7c80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
7c90: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
7ca0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
7cb0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
7cc0: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
7cd0: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
7ce0: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
7cf0: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
7d00: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
7d10: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
7d20: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
7d30: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
7d40: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
7d50: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
7d60: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
7d70: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
7d80: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
7d90: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7da0: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
7db0: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
7dc0: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
7dd0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7de0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
7df0: 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
7e00: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
7e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7e20: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
7e30: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
7e40: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7e50: 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68   start>=pPage->h
7e60: 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67  drOffset+6+(pPag
7e70: 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a  e->leaf?0:4) );.
7e80: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
7e90: 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d   + size)<=pPage-
7ea0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
7eb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
7ec0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7ed0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
7ee0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
7ef0: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
7f00: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
7f10: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64  ze is 4 */..#ifd
7f20: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
7f30: 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65  _DELETE.  /* Ove
7f40: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
7f50: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
7f60: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53  zeros when the S
7f70: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20  ECURE_DELETE .  
7f80: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
7f90: 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
7fa0: 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  time */.  memset
7fb0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
7fc0: 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  , size);.#endif.
7fd0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
7fe0: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
7ff0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
8000: 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20   freeblocks */. 
8010: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
8020: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
8030: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
8040: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
8050: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
8060: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
8070: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  egin>0 ){.    as
8080: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
8090: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
80a0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69 66  Size-4 );.    if
80b0: 28 20 70 62 65 67 69 6e 3c 3d 61 64 64 72 20 29  ( pbegin<=addr )
80c0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
80d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
80e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
80f0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
8100: 7d 0a 20 20 69 66 20 28 20 70 62 65 67 69 6e 3e  }.  if ( pbegin>
8110: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
8120: 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a 20 20 20  leSize-4 ) {.   
8130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8140: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
8150: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
8160: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
8170: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
8180: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
8190: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
81a0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
81b0: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
81c0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
81d0: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
81e0: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 28 75 31  ge->nFree += (u1
81f0: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
8200: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
8210: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
8220: 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68   addr = pPage->h
8230: 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20  drOffset + 1;.  
8240: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
8250: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8260: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
8270: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
8280: 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74  e, x;.    assert
8290: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
82a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
82b0: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
82c0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
82d0: 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74  .    pnext = get
82e0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
82f0: 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20  in]);.    psize 
8300: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8310: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
8320: 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73   if( pbegin + ps
8330: 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74  ize + 3 >= pnext
8340: 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20   && pnext>0 ){. 
8350: 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20       int frag = 
8360: 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b  pnext - (pbegin+
8370: 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  psize);.      if
8380: 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66  ( (frag<0) || (f
8390: 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 70 50  rag>(int)data[pP
83a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
83b0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
83c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
83d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
83e0: 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 70 50 61  }.      data[pPa
83f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d  ge->hdrOffset+7]
8400: 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20   -= (u8)frag;.  
8410: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
8420: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a  (&data[pnext]);.
8430: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
8440: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29  data[pbegin], x)
8450: 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78  ;.      x = pnex
8460: 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  t + get2byte(&da
8470: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70  ta[pnext+2]) - p
8480: 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74  begin;.      put
8490: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
84a0: 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d  in+2], x);.    }
84b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
84c0: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
84d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
84e0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
84f0: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
8500: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
8510: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
8520: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
8530: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
8540: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
8550: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
8560: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
8570: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8580: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
8590: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
85a0: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
85b0: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
85c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
85d0: 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79  hdr+5]) + get2by
85e0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
85f0: 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  2]);.    put2byt
8600: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
8610: 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  top);.  }.  asse
8620: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8630: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8640: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8660: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
8670: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
8680: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
8690: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
86a0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
86b0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
86c0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
86d0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
86e0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
86f0: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
8700: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
8710: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
8720: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
8730: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
8740: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
8750: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
8760: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
8770: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
8780: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
8790: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
87a0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
87b0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
87c0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
87d0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
87e0: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
87f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
8800: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
8810: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
8820: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
8830: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
8840: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
8850: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
8860: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
8870: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
8880: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
8890: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
88a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
88b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
88c0: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
88d0: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
88e0: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
88f0: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
8900: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
8910: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
8920: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
8930: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
8940: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
8950: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
8960: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
8970: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
8980: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
8990: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
89a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
89b0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
89c0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
89d0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
89e0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
89f0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
8a00: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
8a10: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
8a20: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
8a30: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
8a40: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
8a50: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a  e->hasData = 0;.
8a60: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
8a70: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
8a80: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
8a90: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
8aa0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
8ab0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
8ac0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8ad0: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
8ae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8af0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
8b00: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
8b10: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
8b20: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
8b30: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
8b40: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
8b50: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
8b60: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
8b70: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
8b80: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
8b90: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
8ba0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
8bb0: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
8bc0: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
8bd0: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
8be0: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
8bf0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
8c00: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
8c10: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
8c20: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
8c30: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
8c40: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uption..*/.int s
8c50: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
8c60: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8c70: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
8c80: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
8c90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8ca0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8cb0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8cc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8cd0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
8ce0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
8cf0: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
8d00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8d10: 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
8d20: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
8d30: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
8d40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8d50: 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
8d60: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
8d70: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
8d80: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
8d90: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31  isInit ){.    u1
8da0: 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  6 pc;           
8db0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8dc0: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
8dd0: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
8de0: 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20   */.    u8 hdr; 
8df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8e00: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
8e10: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
8e20: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61   */.    u8 *data
8e30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
8e40: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
8e50: 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61  ata */.    BtSha
8e60: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
8e70: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
8e80: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
8e90: 20 20 20 20 75 31 36 20 75 73 61 62 6c 65 53 69      u16 usableSi
8ea0: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
8eb0: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
8ec0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
8ed0: 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  .    u16 cellOff
8ee0: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
8ef0: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
8f00: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
8f10: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
8f20: 20 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20    u16 nFree;    
8f30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8f40: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
8f50: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
8f60: 20 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20    u16 top;      
8f70: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
8f80: 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
8f90: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a  ontent area */..
8fa0: 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d      pBt = pPage-
8fb0: 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d  >pBt;..    hdr =
8fc0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8fd0: 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  t;.    data = pP
8fe0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
8ff0: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
9000: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
9010: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
9020: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9030: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
9040: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
9050: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
9060: 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50  =32768 );.    pP
9070: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
9080: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
9090: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  1;.    pPage->nO
90a0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
90b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
90c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
90d0: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
90e0: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
90f0: 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
9100: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
9110: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9120: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
9130: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
9140: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9150: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
9160: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
9170: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
9180: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
9190: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
91a0: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
91b0: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
91c0: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
91d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
91e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
91f0: 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65   .    /* Compute
9200: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
9210: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
9220: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
9230: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9240: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
9250: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
9260: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
9270: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
9280: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
9290: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
92a0: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
92b0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
92c0: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
92d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
92e0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
92f0: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
9300: 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
9310: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
9320: 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  );.      size = 
9330: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9340: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
9350: 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c   next>0 && next<
9360: 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20  =pc+size+3 ){.  
9370: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
9380: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
9390: 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
93a0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
93b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
93c0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
93d0: 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73        nFree += s
93e0: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
93f0: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
9400: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
9410: 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
9420: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
9430: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
9440: 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
9450: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
9460: 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
9470: 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
9480: 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
9490: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
94a0: 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
94b0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
94c0: 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
94d0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
94e0: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
94f0: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
9500: 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
9510: 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
9520: 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
9530: 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
9540: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
9550: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
9560: 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
9570: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
9580: 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
9590: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
95a0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
95b0: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
95c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
95d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
95e0: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
95f0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46  Page->nFree = nF
9600: 72 65 65 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65  ree - (cellOffse
9610: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
9620: 6c 6c 29 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a  ll);..#if 0.  /*
9630: 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20   Check that all 
9640: 74 68 65 20 6f 66 66 73 65 74 73 20 69 6e 20 74  the offsets in t
9650: 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61  he cell offset a
9660: 72 72 61 79 20 61 72 65 20 77 69 74 68 69 6e 20  rray are within 
9670: 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20 20  range. .  ** .  
9680: 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74 68 69 73  ** Omitting this
9690: 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63 68 65   consistency che
96a0: 63 6b 20 61 6e 64 20 75 73 69 6e 67 20 74 68 65  ck and using the
96b0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
96c0: 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70 72   mask.  ** to pr
96d0: 65 76 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69 6e  event overrunnin
96e0: 67 20 74 68 65 20 70 61 67 65 20 62 75 66 66 65  g the page buffe
96f0: 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29 20  r in findCell() 
9700: 72 65 73 75 6c 74 73 20 69 6e 20 61 0a 20 20 2a  results in a.  *
9710: 2a 20 32 2e 35 25 20 70 65 72 66 6f 72 6d 61 6e  * 2.5% performan
9720: 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ce gain..  */.  
9730: 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66 66 3b 20  {.    u8 *pOff; 
9740: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
9750: 6f 72 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  or used to check
9760: 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65 74   all cell offset
9770: 73 20 61 72 65 20 69 6e 20 72 61 6e 67 65 20 2a  s are in range *
9780: 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 20  /.    u8 *pEnd; 
9790: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
97a0: 72 20 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c 6c  r to end of cell
97b0: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 2a 2f   offset array */
97c0: 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b 20 20 20  .    u8 mask;   
97d0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
97e0: 20 62 69 74 73 20 74 68 61 74 20 6d 75 73 74 20   bits that must 
97f0: 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20 6f  be zero in MSB o
9800: 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 2a  f cell offsets *
9810: 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28 28  /.    mask = ~((
9820: 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
9830: 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20 20  ze>>8))-1);.    
9840: 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c  pEnd = &data[cel
9850: 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d  lOffset + pPage-
9860: 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66  >nCell*2];.    f
9870: 6f 72 28 70 4f 66 66 3d 26 64 61 74 61 5b 63 65  or(pOff=&data[ce
9880: 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66 21  llOffset]; pOff!
9890: 3d 70 45 6e 64 20 26 26 20 21 28 28 2a 70 4f 66  =pEnd && !((*pOf
98a0: 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b 3d  f)&mask); pOff+=
98b0: 32 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 66 66  2);.    if( pOff
98c0: 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  !=pEnd ){.      
98d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
98e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
98f0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
9900: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
9910: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
9920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9930: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
9940: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
9950: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
9960: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
9970: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
9980: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
9990: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
99a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
99b0: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
99c0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
99d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
99e0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
99f0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
9a00: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
9a10: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
9a20: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
9a30: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
9a40: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
9a50: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
9a60: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
9a70: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
9a80: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
9a90: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
9aa0: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
9ab0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9ac0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
9ad0: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
9ae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9af0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9b00: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9b10: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
9b20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9b30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
9b40: 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74 28  ) );.  /*memset(
9b50: 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
9b60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
9b70: 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61 5b   hdr);*/.  data[
9b80: 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
9b90: 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
9ba0: 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67  r + 8 + 4*((flag
9bb0: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
9bc0: 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  1:0);.  memset(&
9bd0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
9be0: 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
9bf0: 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
9c00: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9c10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
9c20: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
9c30: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
9c40: 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65  ze - first;.  de
9c50: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
9c60: 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
9c70: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64  ->hdrOffset = hd
9c80: 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  r;.  pPage->cell
9c90: 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
9ca0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
9cb0: 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
9cc0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
9cd0: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
9ce0: 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a  eSize<=32768 );.
9cf0: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
9d00: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
9d10: 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e  e - 1;.  pPage->
9d20: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
9d30: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
9d40: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
9d50: 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
9d60: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
9d70: 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
9d80: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
9d90: 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
9da0: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
9db0: 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
9dc0: 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
9dd0: 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
9de0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
9df0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9e00: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
9e10: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
9e20: 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ra(pDbPage);.  p
9e30: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
9e40: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
9e50: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
9e60: 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
9e70: 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d  DbPage;.  pPage-
9e80: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
9e90: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
9ea0: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
9eb0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
9ec0: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
9ed0: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
9ee0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
9ef0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
9f00: 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
9f10: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
9f20: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
9f30: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
9f40: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  if needed..**.**
9f50: 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   If the noConten
9f60: 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  t flag is set, i
9f70: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
9f80: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
9f90: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
9fa0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
9fb0: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
9fc0: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
9fd0: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
9fe0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
9ff0: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
a000: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
a010: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
a020: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
a030: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
a040: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
a050: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
a060: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
a070: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
a080: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
a090: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
a0a0: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
a0b0: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
a0c0: 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
a0d0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
a0e0: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
a0f0: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
a100: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
a110: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
a120: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
a130: 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
a140: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
a150: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
a160: 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
a170: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
a180: 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
a190: 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  t        /* Do n
a1a0: 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e  ot load page con
a1b0: 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  tent if true */.
a1c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
a1d0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
a1e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a1f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
a200: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
a210: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
a220: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
a230: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
a240: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e  ge**)&pDbPage, n
a250: 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28  oContent);.  if(
a260: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a270: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
a280: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
a290: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
a2a0: 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
a2b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a2c0: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
a2d0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
a2e0: 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
a2f0: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
a300: 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
a310: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
a320: 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
a330: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
a340: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
a350: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
a360: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
a370: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
a380: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
a390: 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
a3a0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
a3b0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
a3c0: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
a3d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a3e0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
a3f0: 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
a400: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
a410: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
a420: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
a430: 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
a440: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
a450: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
a460: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
a470: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
a480: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
a490: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
a4a0: 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
a4b0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
a4c0: 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
a4d0: 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
a4e0: 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
a4f0: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 61  /.static Pgno pa
a500: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42 74 53  gerPagecount(BtS
a510: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
a520: 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a 20  nt nPage = -1;. 
a530: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
a540: 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  t( pBt->pPage1 )
a550: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a560: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
a570: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
a580: 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ge);.  assert( r
a590: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
a5a0: 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20 20 72  nPage==-1 );.  r
a5b0: 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50 61 67  eturn (Pgno)nPag
a5c0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  e;.}../*.** Get 
a5d0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
a5e0: 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
a5f0: 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72  lize it.  This r
a600: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73  outine.** is jus
a610: 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  t a convenience 
a620: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
a630: 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f  eparate calls to
a640: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
a650: 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73 71  GetPage() and sq
a660: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
a670: 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
a680: 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
a690: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
a6a0: 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pBt,          /*
a6b0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
a6c0: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
a6d0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
a6e0: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
a6f0: 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d  ge to get */.  M
a700: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20  emPage **ppPage 
a710: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
a720: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
a730: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
a740: 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
a750: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
a760: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a770: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
a780: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ;.  if( pgno==0 
a790: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a7a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a7b0: 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  T; .  }..  /* It
a7c0: 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63 61   is often the ca
a7d0: 73 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  se that the page
a7e0: 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72 65   we want is alre
a7f0: 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20 20  ady in cache..  
a800: 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69 74  ** If so, get it
a810: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
a820: 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20 68   saves us from h
a830: 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20 20  aving to call.  
a840: 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  ** pagerPagecoun
a850: 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  t() to make sure
a860: 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e 20   pgno is within 
a870: 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72 65  limits, which re
a880: 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20  sults.  ** in a 
a890: 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65 72 66  measureable perf
a8a0: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
a8b0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70  ents..  */.  *pp
a8c0: 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20 62  Page = pPage = b
a8d0: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
a8e0: 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  Bt, pgno);.  if(
a8f0: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a   pPage ){.    /*
a900: 20 50 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   Page is already
a910: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
a920: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a930: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
a940: 20 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61 63   Page not in cac
a950: 68 65 2e 20 20 41 63 71 75 69 72 65 20 69 74 2e  he.  Acquire it.
a960: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
a970: 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
a980: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65  pBt) ){.      re
a990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a9a0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
a9b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a9c0: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
a9d0: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
a9e0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
a9f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
aa00: 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67 65   pPage = *ppPage
aa10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
aa20: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
aa30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
aa40: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
aa50: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
aa60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
aa70: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
aa80: 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50 61  Page);.    *ppPa
aa90: 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
aaa0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
aab0: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
aac0: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
aad0: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
aae0: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
aaf0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
ab00: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e 0a  e3BtreeGetPage..
ab10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
ab20: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
ab30: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
ab40: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
ab50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
ab60: 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71  verflow==0 || sq
ab70: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
ab80: 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 44  fcount(pPage->pD
ab90: 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20 20 20  bPage)>1 );.    
aba0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
abb0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
abc0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
abd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
abe0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
abf0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
ac00: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
ac10: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
ac20: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
ac30: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
ac40: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
ac50: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
ac60: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ac70: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ac80: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
ac90: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
aca0: 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
acb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
acc0: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
acd0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
ace0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
acf0: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
ad00: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
ad10: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
ad20: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
ad30: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
ad40: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
ad50: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
ad60: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
ad70: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
ad80: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
ad90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ada0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
adb0: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
adc0: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
add0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
ade0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
adf0: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
ae00: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
ae10: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
ae20: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
ae30: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
ae40: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
ae50: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
ae60: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
ae70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ae80: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
ae90: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
aea0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
aeb0: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
aec0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
aed0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
aee0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
aef0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
af00: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
af10: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
af20: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
af30: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
af40: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
af50: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
af60: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
af70: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
af80: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
af90: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
afa0: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
afb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
afc0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
afd0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
afe0: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
aff0: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
b000: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
b010: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
b020: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
b030: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
b040: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
b050: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42       ** sqlite3B
b060: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
b070: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
b080: 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
b090: 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
b0a0: 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
b0b0: 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
b0c0: 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
b0d0: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
b0e0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
b0f0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
b100: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
b110: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
b120: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
b130: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
b140: 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
b150: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
b160: 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
b170: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
b180: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
b190: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
b1a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b1b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
b1c0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
b1d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
b1e0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
b1f0: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
b200: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
b210: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
b220: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
b230: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
b240: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
b250: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
b260: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
b270: 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61  .** a new databa
b280: 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d  se with a random
b290: 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64   name is created
b2a0: 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79  .  This randomly
b2b0: 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61   named.** databa
b2c0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
b2d0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c  deleted when sql
b2e0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
b2f0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49   is called..** I
b300: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
b310: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
b320: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
b330: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
b340: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
b350: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
b360: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
b370: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  osed..**.** If t
b380: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
b390: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
b3a0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
b3b0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
b3c0: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
b3d0: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
b3e0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
b3f0: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
b400: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
b410: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
b420: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
b430: 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
b440: 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
b450: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
b460: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
b470: 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
b480: 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
b490: 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
b4a0: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
b4b0: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
b4c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
b4d0: 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
b4e0: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
b4f0: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
b500: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
b510: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
b520: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
b530: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
b540: 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
b550: 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
b560: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
b570: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
b580: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
b590: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
b5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
b5b0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
b5c0: 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
b5d0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
b5e0: 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
b5f0: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
b600: 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ) */.){.  sqlite
b610: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
b620: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b630: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
b640: 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
b650: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
b660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b670: 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
b680: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
b690: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
b6c0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
b6d0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
b6e0: 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50  xOpen = 0;  /* P
b6f0: 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63  revents a race c
b700: 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74  ondition. Ticket
b710: 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20   #3537 */.  int 
b720: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
b730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b740: 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74  sult code from t
b750: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
b760: 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20    u8 nReserve;  
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73   /* Byte of unus
b790: 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  ed space on each
b7a0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
b7b0: 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
b7c0: 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74  er[100];  /* Dat
b7d0: 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e  abase header con
b7e0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65  tent */..  /* Se
b7f0: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
b800: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
b810: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
b820: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
b830: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
b840: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
b850: 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20  se. This symbol 
b860: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
b870: 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20   if.  ** either 
b880: 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  of the shared-da
b890: 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d  ta or autovacuum
b8a0: 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f   features are co
b8b0: 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74  mpiled .  ** int
b8c0: 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20  o the library.. 
b8d0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
b8e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
b8f0: 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64  RED_CACHE) || !d
b900: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b910: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20  IT_AUTOVACUUM). 
b920: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
b930: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
b940: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
b950: 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a  db = 0;.  #else.
b960: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
b970: 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  Memdb = zFilenam
b980: 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69  e && !strcmp(zFi
b990: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
b9a0: 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65  :");.  #endif.#e
b9b0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
b9c0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
b9d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b9e0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
b9f0: 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62   );..  pVfs = db
ba00: 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71  ->pVfs;.  p = sq
ba10: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
ba20: 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
ba30: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
ba40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ba50: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  MEM;.  }.  p->in
ba60: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
ba70: 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
ba80: 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
ba90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
baa0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
bab0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bac0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
bad0: 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
bae0: 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
baf0: 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
bb00: 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
bb10: 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
bb20: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
bb30: 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
bb40: 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
bb50: 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20  ( isMemdb==0 && 
bb60: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
bb70: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
bb80: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
bb90: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
bba0: 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
bbb0: 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
bbc0: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
bbd0: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
bbe0: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
bbf0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
bc00: 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68  Malloc(nFullPath
bc10: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  name);.      sql
bc20: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
bc30: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
bc40: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
bc50: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
bc60: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64  |= SQLITE_Shared
bc70: 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28  Cache;.      if(
bc80: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
bc90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
bca0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
bcb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bcc0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
bcd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
bce0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
bcf0: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  s, zFilename, nF
bd00: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
bd10: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
bd20: 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
bd30: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
bd40: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
bd50: 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
bd60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bd70: 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
bd80: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
bd90: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
bda0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
bdb0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
bdc0: 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
bdd0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
bde0: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
bdf0: 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
be00: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
be10: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
be20: 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
be30: 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
be40: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
be50: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
be60: 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
be70: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
be80: 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
be90: 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ame(pBt->pPager)
bea0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
beb0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
bec0: 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
bed0: 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
bee0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
bef0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
bf00: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
bf10: 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
bf20: 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
bf30: 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
bf40: 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
bf50: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
bf60: 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
bf70: 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
bf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
bf90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
bfa0: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
bfb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
bfc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
bfd0: 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
bff0: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
c000: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
c010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c020: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
c030: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c040: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
c050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
c060: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c070: 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
c080: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
c090: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
c0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c0b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c0c0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
c0d0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
c0e0: 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
c0f0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
c100: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
c110: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
c120: 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
c130: 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
c140: 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
c150: 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
c160: 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
c170: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
c180: 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
c190: 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
c1a0: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
c1b0: 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
c1c0: 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
c1d0: 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
c1e0: 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
c1f0: 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
c200: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
c210: 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
c220: 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
c230: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
c240: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
c250: 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
c260: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
c270: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
c280: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
c290: 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
c2a0: 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
c2b0: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
c2c0: 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
c2d0: 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
c2e0: 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
c2f0: 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
c300: 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
c310: 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
c320: 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
c330: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
c340: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
c350: 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
c360: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29  8 || sizeof(i64)
c370: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
c380: 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
c390: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29  8 || sizeof(u64)
c3a0: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
c3b0: 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
c3c0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
c3d0: 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
c3e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
c3f0: 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
c400: 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
c410: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
c420: 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
c430: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
c440: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
c450: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
c460: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
c470: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
c480: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
c490: 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
c4a0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
c4b0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
c4e0: 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20  gs, vfsFlags);. 
c4f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c500: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
c510: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
c520: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
c530: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
c540: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
c550: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
c560: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c570: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
c580: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
c590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
c5a0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
c5b0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
c5c0: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
c5d0: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
c5e0: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
c5f0: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
c600: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c   pBt;.  .    sql
c610: 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
c620: 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  iter(pBt->pPager
c630: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
c640: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
c650: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
c660: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
c670: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
c680: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
c690: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
c6a0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
c6b0: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
c6c0: 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b  &zDbHeader[16]);
c6d0: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
c6e0: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
c6f0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
c700: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
c710: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
c720: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
c730: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
c740: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
c750: 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
c760: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c770: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
c780: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
c790: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
c7a0: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
c7b0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
c7c0: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
c7d0: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
c7e0: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
c7f0: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
c800: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
c810: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
c820: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
c830: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
c840: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
c850: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
c860: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
c870: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
c880: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
c890: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
c8a0: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
c8b0: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
c8c0: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
c8d0: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
c8e0: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
c8f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c900: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
c910: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
c920: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
c930: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
c940: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
c950: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
c960: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
c970: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
c980: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
c990: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
c9a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
c9b0: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
c9c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
c9d0: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
c9e0: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
c9f0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
ca00: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
ca10: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ca20: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
ca30: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
ca40: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
ca50: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
ca60: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
ca70: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
ca80: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
ca90: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
caa0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
cab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
cac0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
cad0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
cae0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
caf0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
cb00: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
cb10: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
cb20: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
cb30: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
cb40: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
cb50: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
cb60: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
cb70: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
cb80: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
cb90: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
cba0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
cbb0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
cbc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
cbd0: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
cbe0: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
cbf0: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
cc00: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
cc10: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
cc20: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
cc30: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
cc40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
cc50: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
cc60: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
cc70: 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  1;.      mutexSh
cc80: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
cc90: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
cca0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
ccb0: 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TER);.      if( 
ccc0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
ccd0: 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
cce0: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
ccf0: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
cd00: 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
cd10: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
cd20: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
cd30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
cd40: 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
cd50: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
cd60: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
cd70: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
cd80: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
cd90: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
cda0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
cdb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
cdc0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
cdd0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
cde0: 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
cdf0: 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
ce00: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ce10: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ce20: 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
ce30: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ce40: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ce50: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
ce60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ce70: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
ce80: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
ce90: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
cea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
ceb0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
cec0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ced0: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
cee0: 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
cef0: 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
cf00: 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
cf10: 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
cf20: 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
cf30: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
cf40: 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
cf50: 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
cf60: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
cf70: 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
cf80: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
cf90: 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
cfa0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
cfb0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
cfc0: 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
cfd0: 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
cfe0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
cff0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
d000: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
d010: 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
d020: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
d030: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
d040: 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
d050: 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
d060: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
d070: 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
d080: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
d090: 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
d0a0: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
d0b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
d0c0: 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
d0d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d0e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
d0f0: 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
d100: 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
d110: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
d120: 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
d130: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
d140: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
d150: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
d160: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
d170: 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
d180: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
d190: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
d1a0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
d1b0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
d1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d1d0: 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
d1e0: 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
d1f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d200: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
d210: 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
d220: 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
d230: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
d240: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d250: 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
d260: 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
d270: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
d280: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
d290: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d2a0: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
d2b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d2c0: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
d2d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  = 0;.  }.  if( m
d2e0: 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
d2f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d300: 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
d310: 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
d320: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d330: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
d340: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d350: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
d360: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
d370: 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
d380: 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
d390: 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
d3a0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
d3b0: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
d3c0: 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
d3d0: 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
d3e0: 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
d3f0: 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
d400: 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
d410: 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
d420: 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
d430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d440: 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
d450: 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
d460: 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
d470: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
d480: 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33  _CACHE.  sqlite3
d490: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
d4a0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
d4b0: 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
d4c0: 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
d4d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d4e0: 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
d4f0: 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72  ex) );.  pMaster
d500: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
d510: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
d520: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
d530: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d540: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
d550: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
d560: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
d570: 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
d580: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
d590: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
d5a0: 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
d5b0: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
d5c0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
d5d0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
d5e0: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
d5f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
d600: 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
d610: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
d620: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
d630: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
d640: 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
d650: 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
d660: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
d670: 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
d680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d690: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
d6a0: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
d6b0: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
d6c0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
d6d0: 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
d6e0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
d6f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
d700: 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
d710: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
d720: 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
d730: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d740: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
d750: 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
d760: 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
d770: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
d780: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
d790: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
d7a0: 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
d7b0: 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
d7c0: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
d7d0: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
d7e0: 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
d7f0: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
d800: 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
d810: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
d820: 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
d830: 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
d840: 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
d850: 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  eSize );.  }.}..
d860: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
d870: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
d880: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
d890: 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
d8a0: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
d8b0: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
d8c0: 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
d8d0: 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
d8e0: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
d8f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
d900: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
d910: 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
d920: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
d930: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
d940: 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
d950: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
d960: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
d970: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
d980: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
d990: 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
d9a0: 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
d9b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d9c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
d9d0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
d9e0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
d9f0: 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
da00: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
da10: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
da20: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
da30: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
da40: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
da50: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
da60: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
da70: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
da80: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
da90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
daa0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
dab0: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
dac0: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
dad0: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
dae0: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
daf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
db00: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
db10: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
db20: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
db30: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
db40: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
db50: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
db60: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
db70: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
db80: 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
db90: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
dba0: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
dbb0: 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
dbc0: 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
dbd0: 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
dbe0: 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
dbf0: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
dc00: 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
dc10: 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
dc20: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
dc30: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
dc40: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
dc50: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
dc60: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
dc70: 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
dc80: 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
dc90: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
dca0: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
dcb0: 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
dcc0: 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
dcd0: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
dce0: 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
dcf0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
dd00: 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
dd10: 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
dd20: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
dd30: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
dd40: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
dd50: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
dd60: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
dd70: 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
dd80: 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
dd90: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
dda0: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
ddb0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
ddc0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ddd0: 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65  _free(pBt->pSche
dde0: 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
ddf0: 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
de00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
de10: 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
de20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
de30: 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
de40: 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
de50: 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
de60: 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
de70: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
de80: 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
de90: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
dea0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
deb0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
dec0: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
ded0: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
dee0: 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
def0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
df00: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
df10: 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
df20: 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
df30: 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
df40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
df50: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
df60: 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
df70: 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
df80: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
df90: 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
dfa0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
dfb0: 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
dfc0: 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
dfd0: 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
dfe0: 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
dff0: 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
e000: 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
e010: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
e020: 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
e030: 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
e040: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
e050: 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
e060: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
e070: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
e080: 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
e090: 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
e0a0: 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
e0b0: 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
e0c0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
e0d0: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
e0e0: 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
e0f0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
e100: 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
e110: 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
e120: 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
e130: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
e140: 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
e150: 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
e160: 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
e170: 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
e180: 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
e190: 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
e1a0: 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
e1b0: 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
e1c0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
e1d0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
e1e0: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
e1f0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
e200: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
e210: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e220: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
e230: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
e240: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
e250: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
e260: 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
e270: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
e280: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
e290: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
e2a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e2b0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
e2c0: 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
e2d0: 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
e2e0: 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
e2f0: 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
e300: 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
e310: 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
e320: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
e330: 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
e340: 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
e350: 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
e360: 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
e370: 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
e380: 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
e390: 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
e3a0: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
e3b0: 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
e3c0: 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
e3d0: 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
e3e0: 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
e3f0: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
e400: 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
e410: 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
e420: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
e430: 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
e440: 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
e450: 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
e460: 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
e470: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
e480: 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
e490: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
e4a0: 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65  afetyLevel(Btree
e4b0: 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20   *p, int level, 
e4c0: 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20  int fullSync){. 
e4d0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
e4e0: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
e4f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e500: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
e510: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
e520: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
e530: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
e540: 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d  SafetyLevel(pBt-
e550: 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20  >pPager, level, 
e560: 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
e570: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
e580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
e590: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
e5a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
e5b0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
e5c0: 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
e5d0: 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
e5e0: 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
e5f0: 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
e600: 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
e610: 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
e620: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
e630: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
e640: 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
e650: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e660: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
e670: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
e680: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e690: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
e6a0: 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
e6b0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
e6c0: 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
e6d0: 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
e6e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
e6f0: 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
e700: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
e710: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
e720: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
e730: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
e740: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
e750: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
e760: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
e770: 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  CUUM)./*.** Chan
e780: 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
e790: 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
e7a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
e7b0: 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
e7c0: 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
e7d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
e7e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
e7f0: 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
e800: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
e810: 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
e820: 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
e830: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
e840: 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
e850: 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
e860: 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
e870: 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
e880: 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
e890: 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
e8a0: 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
e8b0: 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
e8c0: 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
e8d0: 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
e8e0: 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
e8f0: 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
e900: 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
e910: 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
e920: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
e930: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
e940: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
e950: 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
e960: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
e970: 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
e980: 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
e990: 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
e9a0: 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
e9b0: 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
e9c0: 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
e9d0: 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
e9e0: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
e9f0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
ea00: 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
ea10: 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
ea20: 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
ea30: 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
ea40: 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
ea50: 53 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69  SizeFixed flag i
ea60: 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
ea70: 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
ea80: 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
ea90: 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
eaa0: 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
eab0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
eac0: 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
ead0: 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
eae0: 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
eaf0: 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
eb00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
eb10: 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
eb20: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
eb30: 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
eb40: 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
eb50: 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
eb60: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
eb70: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
eb80: 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20  izeFixed ){.    
eb90: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
eba0: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
ebb0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
ebc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
ebd0: 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
ebe0: 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
ebf0: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
ec00: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
ec10: 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
ec20: 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
ec30: 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
ec40: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
ec50: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
ec60: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
ec70: 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
ec80: 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
ec90: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
eca0: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
ecb0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
ecc0: 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
ecd0: 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
ece0: 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
ecf0: 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
ed00: 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
ed10: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
ed20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ed30: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
ed40: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
ed50: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
ed60: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
ed70: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
ed80: 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
ed90: 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
eda0: 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ) pBt->pageSize
edb0: 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c  Fixed = 1;.  sql
edc0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
edd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ede0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
edf0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
ee00: 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
ee10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ee20: 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
ee30: 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
ee40: 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
ee50: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
ee60: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
ee70: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
ee80: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
ee90: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
eea0: 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
eeb0: 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
eec0: 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
eed0: 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
eee0: 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
eef0: 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
ef00: 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sions..*/.int sq
ef10: 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
ef20: 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
ef30: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
ef40: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
ef50: 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
ef60: 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
ef70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
ef80: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
ef90: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
efa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
efb0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
efc0: 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
efd0: 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
efe0: 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
eff0: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
f000: 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
f010: 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
f020: 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
f030: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
f040: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
f050: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
f060: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
f070: 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
f080: 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
f090: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
f0a0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
f0b0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
f0c0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
f0d0: 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
f0e0: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
f0f0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
f100: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f110: 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66  turn n;.}.#endif
f120: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
f130: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
f140: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
f150: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f160: 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
f170: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
f180: 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
f190: 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
f1a0: 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
f1b0: 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
f1c0: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
f1d0: 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
f1e0: 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
f1f0: 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
f200: 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
f210: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
f220: 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
f230: 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
f240: 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
f250: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
f260: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
f270: 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
f280: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
f290: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
f2a0: 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
f2b0: 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
f2c0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
f2d0: 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
f2e0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
f2f0: 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
f300: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
f310: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f320: 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
f330: 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
f340: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
f350: 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
f360: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
f370: 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
f380: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
f390: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
f3a0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
f3b0: 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
f3c0: 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
f3d0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
f3e0: 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
f3f0: 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
f400: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
f410: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
f420: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
f430: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
f440: 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
f450: 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
f460: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
f470: 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
f480: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
f490: 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
f4a0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
f4b0: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
f4c0: 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
f4d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
f4e0: 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
f4f0: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
f500: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
f510: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
f520: 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
f530: 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
f540: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
f550: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
f560: 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
f570: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
f580: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
f590: 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
f5a0: 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
f5b0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
f5c0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f5d0: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
f5e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
f5f0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
f600: 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
f610: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
f620: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
f630: 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
f640: 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
f650: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
f660: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
f670: 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
f680: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
f690: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
f6a0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
f6b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
f6c0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
f6d0: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
f6e0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
f6f0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
f700: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
f710: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
f720: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
f730: 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
f740: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
f750: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
f760: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
f770: 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
f780: 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
f790: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f7a0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
f7b0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
f7c0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
f7d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
f7e0: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
f7f0: 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
f800: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f810: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
f820: 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
f830: 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
f840: 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
f850: 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
f860: 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
f870: 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
f880: 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
f890: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
f8a0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
f8b0: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
f8c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f8d0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
f8e0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
f8f0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65   }else if( nPage
f900: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61  >0 ){.    int pa
f910: 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  geSize;.    int 
f920: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
f930: 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
f940: 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
f950: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
f960: 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
f970: 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
f980: 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
f990: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
f9a0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
f9b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
f9c0: 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
f9d0: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
f9e0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
f9f0: 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
fa00: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
fa10: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
fa20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
fa30: 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
fa40: 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
fa50: 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
fa60: 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
fa70: 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
fa80: 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
fa90: 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
faa0: 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
fab0: 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
fac0: 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
fad0: 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
fae0: 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
faf0: 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
fb00: 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
fb10: 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
fb20: 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
fb30: 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
fb40: 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
fb50: 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
fb60: 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
fb70: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
fb80: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
fb90: 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
fba0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67   = get2byte(&pag
fbb0: 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  e1[16]);.    if(
fbc0: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
fbd0: 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70  ageSize)!=0 || p
fbe0: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20  ageSize<512 ||. 
fbf0: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d         (SQLITE_M
fc00: 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37  AX_PAGE_SIZE<327
fc10: 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53  68 && pageSize>S
fc20: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
fc30: 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  IZE).    ){.    
fc40: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
fc50: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
fc60: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
fc70: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
fc80: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
fc90: 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
fca0: 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
fcb0: 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
fcc0: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
fcd0: 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
fce0: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
fcf0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
fd00: 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
fd10: 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
fd20: 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
fd30: 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
fd40: 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
fd50: 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
fd60: 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
fd70: 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
fd80: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
fd90: 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
fda0: 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
fdb0: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
fdc0: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
fdd0: 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
fde0: 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
fdf0: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
fe00: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
fe10: 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
fe20: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
fe30: 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
fe40: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
fe50: 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a  = (u16)usableSiz
fe60: 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
fe70: 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
fe80: 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
fe90: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
fea0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
feb0: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
fec0: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
fed0: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
fee0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
fef0: 29 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69  ) goto page1_ini
ff00: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
ff10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ff20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ff30: 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29  usableSize<500 )
ff40: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
ff50: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
ff60: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
ff70: 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
ff80: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
ff90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28  ->usableSize = (
ffa0: 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u16)usableSize;.
ffb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ffc0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
ffd0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
ffe0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
fff0: 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
10000 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
10010 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
10020 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
10030 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
10040 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
10050 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
10060 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
10070 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
10080 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
10090 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
100a0 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
100b0 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
100c0 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
100d0 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
100e0 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
100f0 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
10100 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
10110 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
10120 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
10130 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
10140 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
10150 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
10160 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
10170 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
10180 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
10190 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
101a0 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
101b0 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
101c0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
101d0 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
101e0 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
101f0 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
10200 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
10210 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  iner, a header w
10220 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
10230 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
10240 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
10250 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
10260 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
10270 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
10280 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
10290 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
102a0 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  axLocal = (pBt->
102b0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36  usableSize-12)*6
102c0 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  4/255 - 23;.  pB
102d0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70  t->minLocal = (p
102e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
102f0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
10300 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
10310 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
10320 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 35;.  pBt->mi
10330 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73  nLeaf = (pBt->us
10340 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
10350 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65  255 - 23;.  asse
10360 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
10370 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
10380 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
10390 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
103a0 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53  age1;.  return S
103b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
103c0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
103d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
103e0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
103f0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
10400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
10410 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
10420 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28   like lockBtree(
10430 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  ) except that it
10440 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68   also invokes th
10450 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61  e.** busy callba
10460 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 6c  ck if there is l
10470 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a  ock contention..
10480 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
10490 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
104a0 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20  (Btree *pRef){. 
104b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
104c0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
104d0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
104e0 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b 0a  sMutex(pRef) );.
104f0 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72    if( pRef->inTr
10500 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
10510 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e  ){.    u8 inTran
10520 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e  saction = pRef->
10530 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
10540 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74  on;.    btreeInt
10550 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20  egrity(pRef);.  
10560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10570 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52  reeBeginTrans(pR
10580 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66  ef, 0);.    pRef
10590 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
105a0 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63  tion = inTransac
105b0 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e  tion;.    pRef->
105c0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
105d0 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63  NONE;.    if( rc
105e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
105f0 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e       pRef->pBt->
10600 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
10610 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49      }.    btreeI
10620 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a  ntegrity(pRef);.
10630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10640 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a  .}.       ../*.*
10650 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
10660 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
10670 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
10680 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
10690 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
106a0 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
106b0 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
106c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
106d0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
106e0 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
106f0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
10700 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10710 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
10720 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
10730 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
10740 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
10750 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74  here are any out
10760 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
10770 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
10780 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
10790 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
107a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
107b0 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
107c0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
107d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
107e0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
107f0 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
10800 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
10810 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10820 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10830 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
10840 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
10850 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75  NONE && pBt->pCu
10860 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e  rsor==0 && pBt->
10870 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
10880 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
10890 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
108a0 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20  Pager)>=1 ){.   
108b0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
108c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
108d0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
108e0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
108f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
10900 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
10910 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
10920 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62  a new database b
10930 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
10940 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
10950 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f   the.** file..*/
10960 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
10970 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
10980 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
10990 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
109a0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
109b0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
109c0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
109d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
109e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
109f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
10a00 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
10a10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
10a20 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
10a30 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61  SQLITE_OK || nPa
10a40 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
10a50 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31  rn rc;.  }.  pP1
10a60 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
10a70 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
10a80 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
10a90 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
10aa0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
10ab0 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
10ac0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
10ad0 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
10ae0 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
10af0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
10b00 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
10b10 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
10b20 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
10b30 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
10b40 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65  a[16], pBt->page
10b50 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38  Size);.  data[18
10b60 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
10b70 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
10b80 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
10b90 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
10ba0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
10bb0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
10bc0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
10bd0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
10be0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
10bf0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
10c00 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
10c10 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
10c20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
10c30 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
10c40 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
10c50 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
10c60 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
10c70 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
10c80 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
10c90 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
10ca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10cb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
10cc0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
10cd0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
10ce0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
10cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
10d00 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
10d10 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
10d20 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
10d30 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
10d40 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
10d50 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
10d60 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
10d70 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
10d80 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
10d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10da0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
10db0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
10dc0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
10dd0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
10de0 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
10df0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
10e00 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
10e10 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
10e20 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
10e30 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
10e40 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
10e50 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
10e60 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
10e70 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
10e80 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
10e90 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
10ea0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
10eb0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
10ec0 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
10ed0 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
10ee0 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
10ef0 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
10f00 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
10f10 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
10f20 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
10f30 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
10f40 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
10f50 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
10f60 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
10f70 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
10f80 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
10f90 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
10fa0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
10fb0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
10fc0 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
10fd0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
10fe0 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
10ff0 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
11000 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
11010 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
11020 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
11030 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
11040 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11050 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
11060 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
11070 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
11080 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
11090 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
110a0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
110b0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
110c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
110d0 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
110e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
110f0 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
11100 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
11110 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
11120 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
11130 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
11140 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
11150 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
11160 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
11170 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
11180 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
11190 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
111a0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
111b0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
111c0 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
111d0 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
111e0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
111f0 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
11200 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
11210 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
11220 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
11230 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
11240 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
11250 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
11260 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
11270 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
11280 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
11290 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
112a0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
112b0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
112c0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
112d0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
112e0 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
112f0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
11300 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
11310 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
11320 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
11330 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
11340 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
11350 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
11360 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
11370 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
11380 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
11390 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
113a0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
113b0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
113c0 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
113d0 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
113e0 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
113f0 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
11400 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
11410 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
11420 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
11430 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
11440 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
11450 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
11460 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
11470 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
11480 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
11490 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
114a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
114b0 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
114c0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
114d0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
114e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
114f0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
11500 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
11510 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
11520 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
11530 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11540 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
11550 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
11560 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
11570 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
11580 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
11590 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
115a0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
115b0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
115c0 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
115d0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
115e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
115f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
11600 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
11610 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
11620 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
11630 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
11640 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
11650 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
11660 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
11670 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
11680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11690 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
116a0 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
116b0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
116c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
116d0 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
116e0 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
116f0 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
11700 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
11710 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
11720 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
11730 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
11740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
11750 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
11760 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
11770 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
11780 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
11790 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
117a0 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
117b0 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
117c0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
117d0 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
117e0 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
117f0 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
11800 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
11810 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
11820 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
11830 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
11840 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
11850 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
11860 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
11870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11880 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
11890 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
118a0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
118b0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
118c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
118d0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
118e0 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
118f0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
11900 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20  endif..  do {.  
11910 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
11920 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
11930 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
11940 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
11950 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
11960 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
11970 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
11980 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
11990 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
119a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
119b0 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
119c0 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
119d0 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
119e0 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
119f0 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
11a00 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
11a10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11a20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
11a30 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
11a40 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
11a50 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
11a60 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
11a70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
11a80 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
11a90 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
11aa0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
11ab0 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
11ac0 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
11ad0 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
11ae0 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
11af0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11b00 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
11b10 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65       if( pBt->re
11b20 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
11b30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
11b40 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
11b50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
11b60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
11b70 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
11b80 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
11b90 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
11ba0 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
11bb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
11bd0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
11be0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
11bf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
11c00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
11c20 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
11c30 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
11c40 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
11c50 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
11c60 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
11c70 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
11c80 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
11c90 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
11ca0 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
11cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11cc0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
11cd0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
11ce0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
11cf0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  saction++;.    }
11d00 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
11d10 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
11d20 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
11d30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
11d40 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
11d50 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
11d60 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
11d70 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
11d80 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  s;.    }.#ifndef
11d90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
11da0 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66  RED_CACHE.    if
11db0 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
11dc0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
11dd0 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
11de0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
11df0 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73  p;.      pBt->is
11e00 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29  Exclusive = (u8)
11e10 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20  (wrflag>1);.    
11e20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
11e30 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
11e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11e50 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
11e60 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
11e70 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
11e80 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
11e90 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
11ea0 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
11eb0 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
11ec0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
11ed0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
11ee0 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
11ef0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
11f00 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
11f10 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
11f20 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
11f30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
11f40 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
11f50 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
11f60 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
11f70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
11f80 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
11f90 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
11fa0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11fb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
11fc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11fd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
11fe0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
11ff0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
12000 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
12010 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
12020 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
12030 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
12040 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
12050 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
12060 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
12070 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
12080 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
12090 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
120a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
120b0 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
120c0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
120d0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
12100 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
12110 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12130 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
12140 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
12150 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
12180 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
12190 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
121a0 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
121b0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
121c0 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
121d0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
121e0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
121f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12200 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
12210 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
12220 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
12230 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
12240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12250 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
12260 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
12270 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
12280 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
12290 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
122a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
122b0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
122c0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
122d0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
122e0 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
122f0 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
12300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12310 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63        goto set_c
12320 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
12330 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
12340 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
12350 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
12360 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
12370 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72  (pCell);.      r
12380 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
12390 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
123a0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
123b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
123c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
123d0 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
123e0 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  aps_out;.    }. 
123f0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
12400 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
12410 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
12420 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
12430 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
12440 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
12450 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
12460 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
12470 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
12480 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  o);.  }..set_chi
12490 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
124a0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
124b0 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
124c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
124d0 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
124e0 20 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73   pPage, which is
124f0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
12500 65 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20  e a btree page, 
12510 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a  not an overflow.
12520 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f  ** page, is a po
12530 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
12540 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73  rom. Modify this
12550 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74   pointer so that
12560 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
12570 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
12580 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
12590 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
125a0 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  ter to be modifi
125b0 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f  ed, as .** follo
125c0 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
125d0 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
125e0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
125f0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
12600 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
12610 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
12620 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
12630 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
12640 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
12650 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
12660 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
12670 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
12680 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
12690 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
126a0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
126b0 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
126c0 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
126d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
126e0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
126f0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
12700 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
12710 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
12740 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
12750 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
12760 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
12770 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
12780 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
12790 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
127a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
127b0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
127c0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
127d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
127e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
127f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
12800 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
12810 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
12820 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
12830 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
12840 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
12850 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
12860 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
12870 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
12880 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
12890 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
128a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
128b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
128c0 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
128d0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
128e0 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
128f0 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
12900 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
12910 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12920 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
12930 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
12940 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
12950 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
12960 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
12970 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
12980 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
12990 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
129a0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
129b0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
129c0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
129d0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
129e0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71  info;.        sq
129f0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
12a00 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
12a10 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
12a20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
12a30 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
12a40 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
12a50 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
12a60 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
12a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12a80 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
12a90 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
12aa0 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
12ab0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12ad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12ae0 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
12af0 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
12b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
12b10 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
12b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
12b30 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
12b40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
12b50 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
12b60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
12b70 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
12b80 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
12b90 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
12ba0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
12bb0 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
12bc0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
12bd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12be0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
12bf0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
12c00 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
12c10 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
12c20 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
12c30 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
12c40 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
12c50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12c60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
12c70 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
12c80 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
12c90 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
12ca0 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
12cb0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
12cc0 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
12cd0 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
12ce0 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alid..*/.static 
12cf0 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
12d00 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
12d10 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
12d20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
12d30 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
12d40 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
12d50 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
12d60 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
12d70 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12d80 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
12d90 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
12da0 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
12db0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
12dc0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
12dd0 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
12de0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
12df0 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
12e00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
12e10 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
12e20 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
12e30 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20  t isCommit.){.  
12e40 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
12e50 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
12e60 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
12e70 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
12e80 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
12e90 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
12ea0 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
12eb0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
12ec0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
12ed0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
12ee0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
12ef0 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
12f00 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
12f10 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
12f20 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
12f30 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
12f40 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
12f50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12f60 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
12f70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
12f80 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
12f90 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
12fa0 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
12fb0 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
12fc0 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
12fd0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
12fe0 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
12ff0 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
13000 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
13010 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
13020 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
13030 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
13040 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
13050 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
13060 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
13070 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
13080 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
13090 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
130a0 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
130b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
130c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
130d0 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
130e0 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
130f0 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
13100 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
13110 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
13120 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
13130 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
13140 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
13150 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
13160 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
13170 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
13180 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
13190 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
131a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
131b0 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
131c0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
131d0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
131e0 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
131f0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
13200 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
13210 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
13220 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
13230 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
13240 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
13250 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
13260 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
13270 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
13280 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
13290 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
132a0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
132b0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
132c0 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
132d0 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
132e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
132f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
13300 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
13310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
13320 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
13330 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
13340 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
13350 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
13360 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
13370 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
13380 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
13390 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20  2, iFreePage);. 
133a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
133b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
133c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
133d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
133e0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
133f0 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
13400 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
13410 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
13420 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
13430 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
13440 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
13450 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
13460 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
13470 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
13480 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
13490 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
134a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
134b0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
134c0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
134d0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
134e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
134f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
13500 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
13510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13520 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
13530 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
13540 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
13560 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
13570 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13580 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
13590 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
135a0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
135b0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
135c0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
135d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
135e0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
135f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13600 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
13610 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
13620 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
13630 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
13640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13650 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
13660 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
13670 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
13680 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
13690 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
136a0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
136b0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
136c0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
136d0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
136e0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
136f0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
13700 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
13710 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
13720 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
13730 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
13740 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
13750 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20  ore no.** point 
13760 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  in calling this 
13770 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
13780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
13790 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ONE..**.** More 
137a0 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73  specificly, this
137b0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
137c0 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
137d0 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  e the .** databa
137e0 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c  se so that the l
137f0 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
13800 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
13810 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c  n use.** is no l
13820 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
13830 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20  .** If the nFin 
13840 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
13850 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65  -zero, the imple
13860 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mentation assume
13870 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61  s.** that the ca
13880 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
13890 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
138a0 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a  mStep() until.**
138b0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
138c0 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72  TE_DONE or an er
138d0 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46  ror, and that nF
138e0 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  in is the.** num
138f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65  ber of pages the
13900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
13910 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65  ill contain afte
13920 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65  r this .** proce
13930 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a  ss is complete..
13940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
13950 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
13960 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
13970 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
13980 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  tPg){.  Pgno nFr
13990 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
139a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
139b0 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
139c0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
139d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
139e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
139f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
13a00 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
13a10 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
13a20 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
13a30 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
13a40 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
13a50 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
13a60 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
13a70 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
13a80 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
13a90 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
13aa0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
13ab0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
13ac0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
13ad0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
13ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
13af0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
13b00 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
13b10 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
13b20 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
13b30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
13b50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
13b60 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
13b70 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
13b80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13b90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
13ba0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
13bb0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
13bc0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
13bd0 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
13be0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
13bf0 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
13c00 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
13c10 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
13c20 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
13c30 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73     ** if nFin is
13c40 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
13c50 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
13c60 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
13c70 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
13c80 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
13c90 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
13ca0 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
13cb0 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
13cc0 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
13cd0 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
13ce0 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
13cf0 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
13d00 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
13d10 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
13d20 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
13d30 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
13d40 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
13d50 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
13d60 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
13d70 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
13d80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13d90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
13da0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
13db0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13dc0 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
13dd0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
13de0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
13df0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13e00 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
13e10 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
13e20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13e30 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
13e40 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
13e50 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
13e60 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20  e *pLastPg;..   
13e70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13e80 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
13e90 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
13ea0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
13eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13ec0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
13ed0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
13ee0 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20       /* If nFin 
13ef0 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
13f00 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
13f10 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
13f20 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
13f30 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
13f40 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
13f50 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
13f60 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
13f70 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
13f80 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
13f90 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65  , if nFin is gre
13fa0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
13fb0 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
13fc0 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
13fd0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
13fe0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
13ff0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
14000 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
14010 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
14020 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
14030 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
14040 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
14050 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
14060 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
14070 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
14080 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eePg, 0, 0);.   
14090 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
140a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
140b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
140c0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
140d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
140e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
140f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
14100 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
14110 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20  ile( nFin!=0 && 
14120 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
14130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
14140 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
14150 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
14160 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
14170 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44  rite(pLastPg->pD
14180 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
14190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
141a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
141b0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
141c0 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
141d0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
141e0 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20  ePg, nFin!=0);. 
141f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
14200 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
14210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14230 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14250 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d   }..  if( nFin==
14260 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67  0 ){.    iLastPg
14270 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  --;.    while( i
14280 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
14290 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c  BYTE_PAGE(pBt)||
142a0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
142b0 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20  t, iLastPg) ){. 
142c0 20 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f       if( PTRMAP_
142d0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
142e0 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tPg) ){.        
142f0 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20  MemPage *pPg;.  
14300 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
14310 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
14320 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
14330 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20   &pPg, 0);.     
14340 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
14380 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14390 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
143a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
143b0 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
143c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
143d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
143e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
143f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14400 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   }.      iLastPg
14410 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  --;.    }.    sq
14420 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
14430 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
14440 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20  ger, iLastPg);. 
14450 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14460 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14470 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
14480 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
14490 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
144a0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
144b0 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
144c0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
144d0 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
144e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
144f0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
14500 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
14510 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
14520 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
14530 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
14540 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
14550 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
14560 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
14570 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
14580 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
14590 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
145a0 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
145b0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
145c0 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
145d0 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
145e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
145f0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
14600 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14610 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14620 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
14630 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
14640 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
14650 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
14660 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
14670 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
14680 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
14690 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
146a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
146b0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
146c0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
146d0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
146e0 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70  umStep(pBt, 0, p
146f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
14700 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t));.  }.  sqlit
14710 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14720 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14730 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14740 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
14750 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
14760 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
14770 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
14780 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
14790 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
147a0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
147b0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
147c0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
147d0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
147e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
147f0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
14800 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
14810 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
14820 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
14830 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
14840 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
14850 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
14860 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
14870 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
14880 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
14890 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
148a0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
148b0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
148c0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
148d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
148e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
148f0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
14900 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
14910 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
14920 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
14930 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
14940 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14950 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
14960 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
14970 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
14980 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
14990 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
149a0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
149b0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
149c0 50 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50  Pgno nFin;.    P
149d0 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 50  gno nFree;.    P
149e0 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  gno nPtrmap;.   
149f0 20 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20   Pgno iFree;.   
14a00 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
14a10 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  = pBt->pageSize;
14a20 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
14a30 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
14a40 28 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  (pBt);..    if( 
14a50 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
14a60 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
14a70 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
14a80 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
14a90 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
14aa0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
14ab0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
14ac0 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
14ad0 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
14ae0 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
14af0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
14b00 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
14b10 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
14b20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
14b30 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
14b40 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
14b50 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
14b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14b70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14b80 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
14b90 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
14ba0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
14bb0 5d 29 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20  ]);.    nPtrmap 
14bc0 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
14bd0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
14be0 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29  , nOrig)+pgsz/5)
14bf0 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 6e  /(pgsz/5);.    n
14c00 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
14c10 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
14c20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e     if( nOrig>PEN
14c30 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
14c40 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
14c50 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
14c60 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e  t) ){.      nFin
14c70 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  --;.    }.    wh
14c80 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
14c90 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
14ca0 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
14cb0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
14cc0 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
14cd0 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 46     }..    for(iF
14ce0 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
14cf0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
14d00 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
14d10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
14d20 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
14d30 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20   nFin, iFree);. 
14d40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
14d50 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
14d60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
14d70 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
14d80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14d90 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  OK;.      rc = s
14da0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
14db0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
14dc0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
14dd0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
14de0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
14df0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
14e00 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
14e10 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
14e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14e30 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
14e40 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69  pBt->pPager, nFi
14e50 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
14e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14e70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14e80 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14e90 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
14ea0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
14eb0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ==sqlite3PagerRe
14ec0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
14ed0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14ee0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  ..#endif /* ifnd
14ef0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14f00 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a  UTOVACUUM */../*
14f10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14f20 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
14f30 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
14f40 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
14f50 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
14f60 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
14f70 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
14f80 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
14f90 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
14fa0 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
14fb0 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
14fc0 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
14fd0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
14fe0 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
14ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
15000 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
15010 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
15020 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
15030 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
15040 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
15050 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
15060 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
15070 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
15080 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
15090 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
150a0 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
150b0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
150c0 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
150d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
150e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
150f0 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
15100 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
15110 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
15120 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
15130 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
15140 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
15150 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
15160 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
15170 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
15180 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
15190 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
151a0 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
151b0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
151c0 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
151d0 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
151e0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
151f0 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
15200 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
15210 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
15220 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
15230 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
15240 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
15250 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
15260 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
15270 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
15280 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
15290 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
152a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
152b0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
152c0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
152d0 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
152e0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
152f0 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
15300 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
15310 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
15320 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
15330 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
15340 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
15350 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
15360 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
15370 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
15380 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
15390 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
153a0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
153b0 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
153c0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
153d0 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
153e0 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
153f0 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
15400 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
15410 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
15420 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
15430 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
15440 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
15450 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
15460 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15470 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
15480 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
15490 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
154a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
154b0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
154c0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
154d0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
154e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
154f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
15500 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
15510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15520 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
15530 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
15540 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
15550 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
15560 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
15570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15580 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15590 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
155a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
155b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
155c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
155d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
155e0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
155f0 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
15600 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
15610 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15620 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
15640 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
15650 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
15660 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
15670 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
15680 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
15690 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
156a0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
156b0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
156c0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
156d0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
156e0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
156f0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
15700 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
15710 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
15720 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
15730 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
15740 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
15750 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
15760 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
15770 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
15780 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
15790 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
157a0 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
157b0 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
157c0 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
157d0 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
157e0 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
157f0 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
15800 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
15810 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
15820 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
15830 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
15840 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
15850 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
15860 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
15870 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   locks..**.** Th
15880 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
15890 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
158a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
158b0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
158c0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
158d0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
158e0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
158f0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
15900 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
15910 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
15920 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
15930 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15940 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15950 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
15960 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
15970 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
15980 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
15990 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
159a0 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
159b0 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
159c0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
159d0 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
159e0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
159f0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
15a00 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
15a10 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
15a20 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
15a30 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15a40 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
15a50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15a60 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
15a70 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
15a80 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
15a90 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
15aa0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
15ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15ac0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
15ad0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15ae0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15af0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
15b00 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
15b10 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
15b20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
15b30 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
15b40 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
15b50 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
15b60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
15b70 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
15b80 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
15b90 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15ba0 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
15bb0 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
15bc0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
15bd0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
15be0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
15bf0 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
15c00 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
15c10 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
15c20 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
15c30 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
15c40 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61  .    clearAllSha
15c50 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
15c60 6b 73 28 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ks(p);.    pBt->
15c70 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
15c80 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
15c90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
15ca0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
15cb0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
15cc0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
15cd0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63  ..  /* Set the c
15ce0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
15cf0 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
15d00 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
15d10 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  k.  ** the pager
15d20 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
15d30 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
15d40 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
15d50 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
15d60 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
15d70 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d 3e  tent(pBt);.  p->
15d80 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
15d90 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  NONE;.  unlockBt
15da0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
15db0 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
15dc0 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
15dd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15de0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15df0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
15e00 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
15e10 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
15e20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
15e30 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
15e40 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
15e50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15e60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
15e70 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
15e80 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
15e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15ea0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15eb0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
15ec0 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71  Two(p);.  }.  sq
15ed0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15ee0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
15ef0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
15f00 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
15f10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  the number of wr
15f20 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite-cursors open
15f30 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   on this handle.
15f40 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
15f50 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
15f60 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
15f70 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
15f80 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
15f90 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
15fa0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
15fb0 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
15fc0 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65  routine, a write
15fd0 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63  -cursor is any c
15fe0 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
15ff0 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74   capable of writ
16000 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
16010 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  se.  That means 
16020 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a  the cursor was.*
16030 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  * originally ope
16040 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
16050 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68  and the cursor h
16060 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c  as not be disabl
16070 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20  ed.** by having 
16080 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65  its state change
16090 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  d to CURSOR_FAUL
160a0 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
160b0 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
160c0 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
160d0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
160e0 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
160f0 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
16100 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
16110 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
16120 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
16130 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72  ->wrFlag && pCur
16140 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
16150 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
16160 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
16170 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
16180 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
16190 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
161a0 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
161b0 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
161c0 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
161d0 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
161e0 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
161f0 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
16200 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
16210 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
16220 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
16230 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
16240 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
16250 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16260 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
16270 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
16280 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
16290 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
162a0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
162b0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
162c0 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
162d0 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
162e0 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
162f0 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
16300 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
16310 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
16320 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
16330 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
16340 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
16350 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
16360 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
16370 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
16380 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
16390 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
163a0 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
163b0 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
163c0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
163d0 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
163e0 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
163f0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
16400 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
16410 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
16420 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
16430 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   *p;.  sqlite3Bt
16440 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
16450 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
16460 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
16470 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
16480 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
16490 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
164a0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70  Cursor(p);.    p
164b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
164c0 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
164d0 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a  skip = errCode;.
164e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
164f0 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
16500 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16510 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
16520 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65  .      p->apPage
16530 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
16540 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
16550 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
16560 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
16570 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
16580 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
16590 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
165a0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
165b0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
165c0 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
165d0 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
165e0 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
165f0 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
16600 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
16610 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
16620 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
16630 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
16640 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
16650 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
16660 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
16670 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
16680 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
16690 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
166a0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
166b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
166c0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
166d0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
166e0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
166f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
16700 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
16710 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16720 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
16730 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
16740 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  Bt, 0, 0);.#ifnd
16750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16760 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66  HARED_CACHE.  if
16770 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16780 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
16790 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74  s a horrible sit
167a0 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72  uation. An IO or
167b0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
167c0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a  occurred whilst.
167d0 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
167e0 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
167f0 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
16800 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
16810 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
16820 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
16830 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
16840 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
16850 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
16860 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
16870 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
16880 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
16890 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
168a0 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
168b0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
168c0 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
168d0 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
168e0 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
168f0 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
16900 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
16910 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
16920 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
16930 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
16940 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
16950 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
16960 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
16970 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
16980 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
16990 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
169a0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
169b0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
169c0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
169d0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
169e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
169f0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
16a00 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
16a10 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
16a20 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
16a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16a40 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
16a50 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
16a60 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
16a70 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
16a80 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
16a90 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
16aa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16ab0 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
16ac0 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
16ad0 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
16ae0 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
16af0 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
16b00 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
16b10 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
16b20 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
16b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16b40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16b50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
16b60 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
16b70 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
16b80 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
16b90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
16ba0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
16bb0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
16bc0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
16bd0 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
16be0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
16bf0 73 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  s(p);.    assert
16c00 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
16c10 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74  ion>0 );.    pBt
16c20 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
16c30 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
16c40 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
16c50 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
16c60 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
16c70 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
16c80 20 7d 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72   }..  btreeClear
16c90 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
16ca0 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
16cb0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e  TRANS_NONE;.  un
16cc0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
16cd0 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
16ce0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
16cf0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16d00 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16d10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
16d20 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
16d30 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
16d40 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
16d50 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c   can can be roll
16d60 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
16d70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
16d80 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
16d90 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
16da0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
16db0 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
16dc0 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
16dd0 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
16de0 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
16df0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
16e00 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
16e10 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
16e20 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
16e30 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
16e40 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
16e50 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
16e60 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
16e70 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
16e80 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
16e90 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
16ea0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
16eb0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
16ec0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
16ed0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
16ee0 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
16ef0 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
16f00 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
16f10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
16f20 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
16f30 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
16f40 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
16f50 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
16f60 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
16f70 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
16f80 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
16f90 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
16fa0 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
16fb0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
16fc0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
16fd0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
16fe0 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
16ff0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
17000 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
17010 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
17020 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
17030 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
17040 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
17050 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
17060 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
17070 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
17080 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
17090 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
170a0 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
170b0 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
170c0 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
170d0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
170e0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
170f0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
17100 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
17110 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
17120 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
17130 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
17140 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17150 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
17160 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17170 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
17180 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
17190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
171a0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
171b0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
171c0 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
171d0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
171e0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
171f0 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  t );.  if( NEVER
17200 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  (p->inTrans!=TRA
17210 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74 2d  NS_WRITE || pBt-
17220 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
17230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
17240 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b  TERNAL;.  }else{
17250 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
17260 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
17270 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
17280 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61      /* At the pa
17290 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
172a0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
172b0 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
172c0 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e  t with.    ** an
172d0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
172e0 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
172f0 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
17300 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20 20  citly using.    
17310 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
17320 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
17330 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
17340 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
17350 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73 61  y.    ** such sa
17360 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
17370 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
17380 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
17390 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
173a0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
173b0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
173c0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
173d0 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
173e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
173f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17400 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17410 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
17420 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
17430 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
17440 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
17450 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
17460 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
17470 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
17480 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
17490 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
174a0 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
174b0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
174c0 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
174d0 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
174e0 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
174f0 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
17500 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
17510 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
17520 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
17530 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
17540 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
17550 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
17560 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
17570 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
17580 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
17590 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
175a0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
175b0 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
175c0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
175d0 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
175e0 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
175f0 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
17600 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
17610 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
17620 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
17630 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
17640 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17650 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
17660 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
17670 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
17680 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17690 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
176a0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
176b0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
176c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
176d0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
176e0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
176f0 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
17700 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
17710 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17720 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
17730 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
17740 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
17750 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
17760 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
17770 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
17780 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
17790 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
177a0 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
177b0 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
177c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
177d0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
177e0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
177f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
17800 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
17810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17820 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
17830 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
17840 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
17850 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
17860 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68  e.** iTable.  Th
17870 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69  e act of acquiri
17880 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73  ng a cursor gets
17890 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
178a0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
178b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
178c0 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
178d0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
178e0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
178f0 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
17900 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
17910 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
17920 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
17930 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
17940 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
17950 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
17960 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
17970 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
17980 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
17990 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
179a0 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
179b0 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
179c0 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
179d0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
179e0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
179f0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
17a00 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
17a10 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17a20 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
17a30 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
17a40 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
17a50 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
17a60 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
17a70 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
17a80 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
17a90 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
17aa0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
17ab0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
17ac0 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
17ad0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
17ae0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
17af0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
17b00 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
17b10 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
17b20 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
17b30 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17b40 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
17b50 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
17b60 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
17b70 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
17b80 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
17b90 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
17ba0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
17bb0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
17bc0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
17bd0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
17be0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
17bf0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
17c00 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
17c10 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
17c20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
17c30 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
17c40 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
17c50 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
17c60 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
17c70 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
17c80 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20  reeCursorSize() 
17c90 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
17ca0 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  .** pointed to b
17cb0 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e  y pCur have been
17cc0 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63   zeroed by the c
17cd0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
17ce0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
17cf0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17d20 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
17d30 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
17d60 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
17d70 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
17d80 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17da0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
17db0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
17dc0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
17dd0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
17de0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
17df0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
17e00 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
17e10 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e30 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
17e40 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
17e50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
17e60 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74 53  gno nPage;.  BtS
17e70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17e80 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
17e90 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
17ea0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
17eb0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
17ec0 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
17ed0 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
17ee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
17ef0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
17f00 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 42 74     if( NEVER(pBt
17f10 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
17f20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17f30 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
17f40 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 68 65 63   }.    rc = chec
17f50 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74  kForReadConflict
17f60 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20  s(p, iTable, 0, 
17f70 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
17f80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17f90 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
17fa0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
17fb0 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20  REDCACHE );.    
17fc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17fd0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42   }.  }..  if( pB
17fe0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
17ff0 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72      rc = lockBtr
18000 65 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a  eeWithRetry(p);.
18010 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18030 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18040 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
18050 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
18060 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ble;.  rc = sqli
18070 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18080 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 28  t(pBt->pPager, (
18090 69 6e 74 20 2a 29 26 6e 50 61 67 65 29 3b 20 0a  int *)&nPage); .
180a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
180b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
180c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
180d0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 6e 50 61  iTable==1 && nPa
180e0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ge==0 ){.    rc 
180f0 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
18100 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
18110 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
18120 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
18130 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
18140 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
18150 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
18160 5d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ]);.  if( rc!=SQ
18170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
18180 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
18190 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
181a0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
181b0 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
181c0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
181d0 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
181e0 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
181f0 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74  ariables, link t
18200 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
18210 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
18220 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20   and set *ppCur 
18230 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74  (the.  ** output
18240 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
18250 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a  s function)..  *
18260 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  /.  pCur->pKeyIn
18270 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
18280 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
18290 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
182a0 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72   pBt;.  pCur->wr
182b0 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61  Flag = (u8)wrFla
182c0 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
182d0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
182e0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
182f0 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
18300 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
18310 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
18320 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
18330 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
18340 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
18350 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  .  pCur->cachedR
18360 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74  owid = 0;..  ret
18370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
18380 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
18390 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61  ception:.  relea
183a0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
183b0 61 67 65 5b 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63  age[0]);.  unloc
183c0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
183d0 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Bt);.  return rc
183e0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
183f0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
18400 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18430 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
18440 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18460 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
18470 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
18480 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
18490 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184b0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
184c0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
184d0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
184e0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18500 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
18510 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
18520 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
18530 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18550 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
18560 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
18570 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
18580 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18590 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
185a0 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
185b0 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
185c0 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
185d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
185e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
185f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18600 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
18610 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
18620 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
18630 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
18640 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
18650 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
18660 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
18670 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
18680 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
18690 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
186a0 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
186b0 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
186c0 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
186d0 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
186e0 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
186f0 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
18700 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
18710 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
18720 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
18730 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66  .  return sizeof
18740 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f  (BtCursor);.}../
18750 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63  *.** Set the cac
18760 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20  hed rowid value 
18770 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  of every cursor 
18780 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
18790 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20  base file.** as 
187a0 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20  pCur and having 
187b0 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
187c0 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75  ge number as pCu
187d0 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  r.  The value is
187e0 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69  .** set to iRowi
187f0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f  d..**.** Only po
18800 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c  sitive rowid val
18810 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
18820 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69  ed valid for thi
18830 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20  s cache..** The 
18840 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c  cache is initial
18850 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e  ized to zero, in
18860 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61  dicating an inva
18870 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20  lid cache..** A 
18880 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20  btree will work 
18890 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f  fine with zero o
188a0 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
188b0 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e  s.  We just cann
188c0 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f  ot.** cache zero
188d0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
188e0 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ids, which means
188f0 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65   tables that use
18900 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61   zero or.** nega
18910 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68  tive rowids migh
18920 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
18930 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70  lower.  But in p
18940 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a  ractice, zero.**
18950 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
18960 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63  ids are very unc
18970 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68  ommon so this sh
18980 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72  ould not be a pr
18990 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
189a0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
189b0 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
189c0 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65  or *pCur, sqlite
189d0 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b  3_int64 iRowid){
189e0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
189f0 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42    for(p=pCur->pB
18a00 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
18a10 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
18a20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
18a30 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
18a40 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  ) p->cachedRowid
18a50 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20   = iRowid;.  }. 
18a60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
18a70 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77  achedRowid==iRow
18a80 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  id );.}../*.** R
18a90 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64  eturn the cached
18aa0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67   rowid for the g
18ab0 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20  iven cursor.  A 
18ac0 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f  negative or zero
18ad0 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
18ae0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
18af0 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
18b00 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  is invalid and s
18b10 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f  hould be.** igno
18b20 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77  red.  If the row
18b30 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76  id cache has nev
18b40 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73  er before been s
18b50 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65  et, then a.** ze
18b60 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
18b70 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
18b80 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18b90 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
18ba0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
18bb0 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68  eturn pCur->cach
18bc0 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  edRowid;.}../*.*
18bd0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
18be0 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
18bf0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18c00 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
18c10 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
18c20 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
18c30 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
18c40 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
18c50 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
18c60 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
18c70 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
18c80 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
18c90 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
18ca0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
18cb0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
18cc0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
18cd0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
18ce0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
18cf0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
18d00 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
18d10 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
18d20 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
18d30 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
18d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18d50 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
18d60 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
18d70 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
18d80 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
18d90 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
18da0 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
18db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
18dc0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
18dd0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
18de0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
18df0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
18e00 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
18e10 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
18e20 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
18e30 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
18e40 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
18e50 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
18e60 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
18e70 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
18e80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18ea0 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f  .** Make a tempo
18eb0 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20 66  rary cursor by f
18ec0 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69  illing in the fi
18ed0 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72  elds of pTempCur
18ee0 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61  ..** The tempora
18ef0 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  ry cursor is not
18f00 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c   on the cursor l
18f10 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72 65  ist for the Btre
18f20 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
18f30 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
18f40 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
18f50 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  Cur, BtCursor *p
18f60 54 65 6d 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  TempCur){.  int 
18f70 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  i;.  assert( cur
18f80 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
18f90 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ur) );.  memcpy(
18fa0 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20  pTempCur, pCur, 
18fb0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
18fc0 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70  );.  pTempCur->p
18fd0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d  Next = 0;.  pTem
18fe0 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b  pCur->pPrev = 0;
18ff0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70  .  for(i=0; i<=p
19000 54 65 6d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  TempCur->iPage; 
19010 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
19020 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43  3PagerRef(pTempC
19030 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70  ur->apPage[i]->p
19040 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61  DbPage);.  }.  a
19050 73 73 65 72 74 28 20 70 54 65 6d 70 43 75 72 2d  ssert( pTempCur-
19060 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  >pKey==0 );.}../
19070 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
19080 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
19090 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
190a0 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
190b0 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
190c0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
190d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
190e0 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
190f0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
19100 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
19110 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
19120 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19130 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  r) );.  for(i=0;
19140 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
19150 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
19160 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75  e3PagerUnref(pCu
19170 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44  r->apPage[i]->pD
19180 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71  bPage);.  }.  sq
19190 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
191a0 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  >pKey);.}..../*.
191b0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
191c0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
191d0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
191e0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
191f0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
19200 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
19210 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
19220 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71  alid, call.** sq
19230 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
19240 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
19250 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
19260 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
19270 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
19280 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
19290 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
192a0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
192b0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
192c0 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73  er of calls to s
192d0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
192e0 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
192f0 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
19300 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
19310 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
19320 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
19330 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
19340 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
19350 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
19360 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
19370 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
19380 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
19390 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
193a0 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
193b0 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
193c0 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
193d0 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
193e0 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
193f0 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
19400 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
19410 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
19420 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
19430 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
19440 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
19450 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
19460 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
19470 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
19480 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
19490 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
194a0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
194b0 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
194c0 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
194d0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
194e0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
194f0 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
19500 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
19510 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
19520 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
19530 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
19540 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
19550 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
19560 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
19570 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
19580 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
19590 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
195a0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
195b0 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
195c0 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
195d0 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
195e0 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
195f0 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
19600 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
19610 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
19620 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
19630 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
19640 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
19650 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
19660 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
19670 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
19680 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
19690 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
196a0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
196b0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
196c0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
196d0 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
196e0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
196f0 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
19700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
19710 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
19720 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
19730 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
19740 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
19750 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
19760 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
19770 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
19780 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
19790 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
197a0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
197f0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
19800 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
19840 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
19850 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c         \.    sql
19890 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
198a0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
198b0 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
198c0 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
198d0 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43  >info); \.    pC
198e0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
198f0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19920 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
19930 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19970 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
19980 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
19990 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
199d0 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
199e0 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  VER */../*.** Se
199f0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
19a00 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
19a10 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
19a20 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
19a30 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
19a40 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
19a50 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
19a60 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
19a70 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
19a80 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
19a90 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
19aa0 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
19ab0 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
19ac0 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
19ad0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
19ae0 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
19af0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
19b00 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
19b10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19b20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
19b30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
19b40 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
19b50 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
19b60 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19b70 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
19b80 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
19b90 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
19ba0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19bb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19bc0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19bd0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
19be0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19bf0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
19c00 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19c10 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
19c20 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69  ID ){.      *pSi
19c30 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
19c40 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
19c50 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
19c60 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
19c70 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
19c80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
19c90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
19ca0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
19cb0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
19cc0 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
19cd0 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
19ce0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
19cf0 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65  s to.  Always re
19d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
19d10 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f  ** Failure is no
19d20 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20  t possible.  If 
19d30 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
19d40 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
19d50 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e  ointing to an en
19d60 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68  try (which can h
19d70 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70  appen, for examp
19d80 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61  le, if.** the da
19d90 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29  tabase is empty)
19da0 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20   then *pSize is 
19db0 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74  set to 0..*/.int
19dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
19dd0 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  aSize(BtCursor *
19de0 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65  pCur, u32 *pSize
19df0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
19e00 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19e10 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19e20 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
19e30 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
19e40 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
19e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19e60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
19e70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
19e80 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
19e90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19ea0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
19eb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19ec0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
19ed0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
19ee0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
19ef0 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
19f00 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
19f10 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
19f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
19f30 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
19f40 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
19f50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
19f60 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
19f70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19f80 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
19f90 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
19fa0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
19fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
19fc0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
19fd0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
19fe0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
19ff0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1a000 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
1a010 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
1a020 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1a030 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
1a040 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
1a050 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
1a060 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
1a070 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
1a080 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
1a090 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
1a0a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1a0b0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
1a0c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1a0d0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1a0e0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
1a0f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1a100 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
1a110 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1a120 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
1a130 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
1a140 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
1a150 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
1a160 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
1a170 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
1a180 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
1a190 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
1a1a0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
1a1b0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
1a1c0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
1a1d0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
1a1e0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
1a1f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
1a200 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
1a210 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
1a220 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1a230 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
1a240 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
1a250 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1a260 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
1a270 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
1a280 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
1a290 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
1a2a0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
1a2b0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
1a2c0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
1a2d0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
1a2e0 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
1a2f0 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
1a300 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
1a310 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
1a320 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
1a330 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
1a340 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
1a350 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
1a360 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a380 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
1a390 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1a3a0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
1a3b0 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
1a3c0 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
1a3d0 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
1a3e0 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
1a3f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1a400 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1a410 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
1a420 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
1a430 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a440 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1a450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1a460 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a470 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1a480 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1a490 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
1a4a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a4b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1a4c0 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
1a4d0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1a4e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1a4f0 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
1a500 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
1a510 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
1a520 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
1a530 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
1a540 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1a550 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
1a560 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
1a570 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
1a580 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
1a590 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
1a5a0 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
1a5b0 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
1a5c0 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
1a5d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1a5e0 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
1a5f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1a600 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1a610 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
1a620 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
1a630 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
1a640 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
1a650 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1a660 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
1a670 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
1a680 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1a690 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
1a6a0 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
1a6b0 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50  ( iGuess<=pagerP
1a6c0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
1a6d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1a6e0 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
1a6f0 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
1a700 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1a710 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
1a720 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1a730 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
1a740 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
1a750 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
1a760 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a770 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
1a780 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1a790 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1a7a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1a7b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1a7c0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
1a7d0 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   &pPage, 0);.   
1a7e0 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
1a7f0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
1a800 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  0);.    if( next
1a810 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
1a820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
1a830 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
1a840 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1a850 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
1a860 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
1a870 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
1a880 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
1a890 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1a8a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1a8b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a8c0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1a8d0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
1a8e0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
1a8f0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
1a900 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
1a910 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
1a920 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
1a930 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
1a940 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1a950 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
1a960 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
1a970 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1a980 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
1a990 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
1a9a0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1a9b0 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
1a9c0 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
1a9d0 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
1a9e0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
1a9f0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
1aa00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1aa10 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
1aa20 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
1aa30 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
1aa40 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
1aa50 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1aa60 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
1aa70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1aa80 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1aa90 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
1aaa0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1aab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
1aac0 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
1aad0 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
1aae0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1aaf0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
1ab00 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
1ab30 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
1ab40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ab50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1ab60 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
1ab70 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
1ab80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1ab90 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
1aba0 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
1abb0 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
1abc0 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
1abd0 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
1abe0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
1abf0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
1ac00 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
1ac10 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
1ac20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
1ac30 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1ac40 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1ac50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
1ac60 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1ac70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ac80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ac90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
1aca0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
1acb0 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
1acc0 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
1acd0 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
1ace0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
1acf0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1ad00 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
1ad10 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
1ad20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1ad30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1ad40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ad50 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1ad60 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
1ad70 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1ad80 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
1ad90 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
1ada0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1adb0 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
1adc0 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
1add0 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
1ade0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
1adf0 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
1ae00 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1ae10 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
1ae20 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
1ae30 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
1ae40 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
1ae50 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
1ae60 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
1ae70 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1ae80 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
1ae90 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
1aea0 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
1aeb0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1aec0 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  uf..**.** This r
1aed0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
1aee0 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69  make a distincti
1aef0 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61  on between key a
1af00 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a  nd data..** It j
1af10 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69  ust reads or wri
1af20 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  tes bytes from t
1af30 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
1af40 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a    Data might .**
1af50 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
1af60 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73  ain page or be s
1af70 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
1af80 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
1af90 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a  w .** pages..**.
1afa0 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
1afb0 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
1afc0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
1afd0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
1afe0 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
1aff0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
1b000 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1b010 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
1b020 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
1b030 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
1b040 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
1b050 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1b060 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
1b070 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
1b080 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
1b090 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
1b0a0 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
1b0b0 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
1b0c0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
1b0d0 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
1b0e0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
1b0f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1b100 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1b110 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
1b120 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
1b130 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
1b140 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
1b150 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
1b160 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
1b170 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
1b180 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
1b190 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
1b1a0 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
1b1b0 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
1b1c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
1b1d0 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
1b1e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1b1f0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
1b200 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
1b210 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
1b220 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
1b230 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
1b240 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
1b250 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
1b260 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
1b270 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
1b280 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
1b290 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
1b2a0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
1b2b0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
1b2c0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1b2d0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
1b2e0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
1b2f0 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
1b300 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
1b310 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
1b320 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
1b330 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
1b340 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
1b350 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
1b360 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
1b370 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
1b380 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
1b390 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
1b3a0 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20  t skipKey,      
1b3b0 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
1b3c0 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
1b3d0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  his is true */. 
1b3e0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
1b3f0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
1b400 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
1b410 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
1b420 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1b430 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
1b440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b450 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
1b460 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
1b470 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1b480 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1b490 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
1b4a0 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
1b4b0 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
1b4c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b4d0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
1b4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1b4f0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
1b500 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
1b510 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
1b520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1b530 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1b540 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1b550 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1b560 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1b570 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1b580 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1b590 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1b5a0 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
1b5b0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1b5c0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1b5d0 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
1b5e0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
1b5f0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
1b600 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
1b610 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
1b620 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
1b630 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20  {.    offset += 
1b640 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
1b650 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65  offset+amt > nKe
1b660 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  y+pCur->info.nDa
1b670 74 61 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c  ta .   || &aPayl
1b680 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1b690 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
1b6a0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
1b6b0 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20  leSize].  ){.   
1b6c0 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
1b6d0 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
1b6e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b6f0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
1b700 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1b710 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1b720 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
1b730 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
1b740 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
1b750 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
1b760 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
1b770 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1b780 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1b790 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
1b7a0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
1b7b0 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
1b7c0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1b7d0 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
1b7e0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
1b7f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1b800 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1b810 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
1b820 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
1b830 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1b840 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1b850 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1b860 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
1b870 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
1b880 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
1b890 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
1b8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b8b0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
1b8c0 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
1b8d0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
1b8e0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
1b8f0 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
1b900 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
1b910 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
1b920 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
1b930 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
1b940 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1b950 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
1b960 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1b970 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
1b980 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
1b990 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
1b9a0 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
1b9b0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
1b9c0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
1b9d0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
1b9e0 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
1b9f0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
1ba00 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
1ba10 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
1ba20 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1ba30 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1ba40 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
1ba50 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1ba60 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
1ba70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1ba80 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
1ba90 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
1baa0 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
1bab0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
1bac0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
1bad0 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
1bae0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
1baf0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
1bb00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1bb10 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
1bb20 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
1bb30 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1bb40 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
1bb50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
1bb60 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
1bb70 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
1bb80 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
1bb90 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1bba0 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
1bbb0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
1bbc0 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
1bbd0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
1bbe0 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  l && !pCur->aOve
1bbf0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
1bc00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1bc10 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1bc20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1bc30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1bc40 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1bc50 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
1bc60 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
1bc70 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
1bc80 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
1bc90 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
1bca0 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
1bcb0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
1bcc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
1bcd0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
1bce0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
1bcf0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
1bd00 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
1bd10 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
1bd20 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
1bd30 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
1bd40 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
1bd50 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
1bd60 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
1bd70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
1bd80 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
1bd90 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
1bda0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
1bdb0 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
1bdc0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1bdd0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
1bde0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
1bdf0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1be00 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
1be10 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
1be20 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
1be30 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
1be40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1be50 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
1be60 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
1be70 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1be80 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1be90 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
1bea0 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
1beb0 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
1bec0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
1bed0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1bee0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
1bef0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
1bf00 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
1bf10 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
1bf20 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
1bf30 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1bf40 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
1bf50 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1bf60 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
1bf70 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
1bf80 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
1bf90 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
1bfa0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
1bfb0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
1bfc0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
1bfd0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
1bfe0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
1bff0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
1c000 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
1c010 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1c020 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
1c030 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1c040 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
1c050 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
1c060 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
1c070 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
1c080 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
1c090 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
1c0a0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
1c0b0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
1c0c0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
1c0d0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
1c0e0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
1c0f0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
1c100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c110 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
1c120 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
1c130 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
1c140 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
1c150 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
1c160 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
1c170 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
1c180 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
1c190 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
1c1a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
1c1b0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
1c1c0 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
1c1d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1c1e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1c1f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
1c200 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
1c210 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c230 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
1c240 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1c250 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
1c260 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
1c270 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
1c280 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
1c290 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
1c2a0 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
1c2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
1c2c0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
1c2d0 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
1c2e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
1c2f0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
1c300 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
1c310 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
1c320 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1c330 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1c340 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
1c350 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
1c360 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
1c370 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
1c380 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
1c390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c3a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c3b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c3c0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
1c3d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c3e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
1c3f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c400 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1c410 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
1c420 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
1c430 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
1c440 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
1c450 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
1c460 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
1c470 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
1c480 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
1c490 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
1c4a0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1c4b0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
1c4c0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
1c4d0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1c4e0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
1c4f0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
1c500 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
1c510 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
1c520 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
1c530 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c540 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
1c550 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
1c560 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
1c570 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
1c580 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
1c590 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c5a0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1c5b0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1c5c0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1c5d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c5e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c5f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c600 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1c610 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1c620 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1c630 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1c640 61 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  age] );.    if( 
1c650 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
1c660 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1c670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1c680 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1c690 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1c6a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1c6b0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1c6c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1c6d0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1c6e0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
1c6f0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1c700 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
1c710 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30  char*)pBuf, 0, 0
1c720 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c730 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
1c740 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
1c750 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
1c760 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
1c770 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
1c780 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
1c790 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
1c7a0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
1c7b0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
1c7c0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
1c7d0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1c7e0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
1c7f0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1c800 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1c810 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
1c820 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1c830 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
1c840 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
1c850 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
1c860 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
1c870 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
1c880 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
1c890 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
1c8a0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
1c8b0 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
1c8c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c8d0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
1c8e0 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
1c8f0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1c900 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c910 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
1c920 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1c930 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c940 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1c950 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1c960 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1c970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c980 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1c990 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1c9a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1c9b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1c9c0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
1c9d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1c9e0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
1c9f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1ca00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1ca10 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
1ca20 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1ca30 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
1ca40 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
1ca50 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
1ca60 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  Buf, 1, 0);.  }.
1ca70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ca80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1ca90 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
1caa0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
1cab0 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
1cac0 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
1cad0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1cae0 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
1caf0 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
1cb00 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
1cb10 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
1cb20 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
1cb30 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1cb40 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
1cb50 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
1cb60 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1cb70 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
1cb80 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
1cb90 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
1cba0 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
1cbb0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
1cbc0 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
1cbd0 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
1cbe0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
1cbf0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
1cc00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
1cc10 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
1cc20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
1cc30 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
1cc40 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
1cc50 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
1cc60 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
1cc70 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
1cc80 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
1cc90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
1cca0 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
1ccb0 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
1ccc0 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
1ccd0 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
1cce0 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
1ccf0 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
1cd00 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
1cd10 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
1cd20 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
1cd30 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
1cd40 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
1cd50 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
1cd60 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
1cd70 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
1cd80 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
1cd90 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
1cda0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
1cdb0 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
1cdc0 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
1cdd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1cde0 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
1cdf0 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
1ce00 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
1ce10 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
1ce20 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
1ce30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
1ce40 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
1ce50 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
1ce60 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1ce70 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1ce80 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1ce90 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
1cea0 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
1ceb0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1cec0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1ced0 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
1cee0 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
1cef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
1cf00 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
1cf10 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
1cf20 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
1cf30 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
1cf40 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
1cf50 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
1cf60 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
1cf70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
1cf80 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
1cf90 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1cfa0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1cfb0 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
1cfc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1cfd0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1cfe0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1cff0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1d000 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1d010 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1d020 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
1d030 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d040 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1d050 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
1d060 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1d070 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1d080 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
1d090 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
1d0a0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1d0b0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1d0c0 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
1d0d0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1d0e0 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75   nKey = (int)pCu
1d0f0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1d100 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
1d110 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
1d120 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
1d130 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1d140 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
1d150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
1d160 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1d170 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
1d180 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
1d190 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
1d1a0 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
1d1b0 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
1d1c0 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
1d1d0 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
1d1e0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1d1f0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
1d200 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
1d210 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
1d220 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
1d230 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
1d240 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
1d250 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
1d260 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
1d270 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1d280 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
1d290 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
1d2a0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
1d2b0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
1d2c0 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
1d2d0 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
1d2e0 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
1d2f0 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
1d300 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
1d310 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
1d320 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
1d330 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
1d340 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
1d350 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
1d360 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
1d370 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
1d380 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
1d390 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1d3a0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1d3b0 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
1d3c0 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
1d3d0 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
1d3e0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
1d3f0 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
1d400 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1d410 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
1d420 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1d430 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
1d440 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1d450 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1d460 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d470 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1d480 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1d490 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d4a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d4b0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
1d4c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d4d0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1d4e0 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
1d4f0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1d500 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
1d510 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1d520 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
1d530 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
1d540 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
1d550 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
1d560 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d570 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1d580 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1d590 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d5a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d5b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
1d5c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1d5d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1d5e0 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
1d5f0 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
1d600 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
1d610 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
1d620 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   0;.}.../*.** Mo
1d630 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1d640 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
1d650 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
1d660 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
1d670 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
1d680 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
1d690 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
1d6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d6b0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
1d6c0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1d6d0 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
1d6e0 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
1d6f0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
1d700 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
1d710 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d720 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
1d730 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1d740 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1d750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1d760 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1d770 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1d780 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
1d790 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
1d7a0 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  TH );.  if( pCur
1d7b0 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
1d7c0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
1d7d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1d7e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1d7f0 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
1d800 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1d810 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
1d820 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1d830 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
1d840 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d  Cur->apPage[i+1]
1d850 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
1d860 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20  Cur->aiIdx[i+1] 
1d870 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
1d880 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ge++;..  pCur->i
1d890 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1d8a0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1d8b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
1d8c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b  Page->nCell<1 ){
1d8d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d8e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d8f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1d900 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
1d910 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
1d920 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
1d930 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
1d940 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
1d950 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1d960 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
1d970 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
1d980 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
1d990 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
1d9a0 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
1d9b0 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
1d9c0 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
1d9d0 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
1d9e0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
1d9f0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
1da00 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
1da10 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
1da20 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
1da30 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
1da40 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1da50 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
1da60 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
1da70 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
1da80 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ild){.  assert( 
1da90 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
1daa0 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
1dab0 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
1dac0 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
1dad0 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
1dae0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
1daf0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
1db00 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1db10 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1db20 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
1db30 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
1db40 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
1db50 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
1db60 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
1db70 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
1db80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
1db90 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
1dba0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
1dbb0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
1dbc0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
1dbd0 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
1dbe0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
1dbf0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
1dc00 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
1dc10 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
1dc20 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1dc30 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
1dc40 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
1dc50 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
1dc60 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
1dc70 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
1dc80 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
1dc90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1dca0 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1dcb0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1dcc0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1dcd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1dce0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1dcf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1dd00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1dd10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
1dd20 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
1dd30 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1dd40 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1dd50 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
1dd60 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
1dd70 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1dd80 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
1dd90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1dda0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
1ddb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1ddc0 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b  Page]->pgno.  );
1ddd0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1dde0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1ddf0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75  ->iPage]);.  pCu
1de00 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43  r->iPage--;.  pC
1de10 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1de20 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1de30 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  dNKey = 0;.}../*
1de40 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1de50 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  sor to the root 
1de60 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  page.*/.static i
1de70 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
1de80 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1de90 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
1dea0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1deb0 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
1dec0 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
1ded0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1dee0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
1def0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1df00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1df10 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1df20 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
1df30 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1df40 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
1df50 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
1df60 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1df70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1df80 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
1df90 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1dfa0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1dfb0 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
1dfc0 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
1dfd0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1dfe0 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
1dff0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e000 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20   pCur->skip;.   
1e010 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1e020 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1e030 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
1e040 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1e050 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1e060 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43    for(i=1; i<=pC
1e070 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1e080 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1e090 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1e0a0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  i]);.    }.  }el
1e0b0 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20  se{.    if( .   
1e0c0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
1e0d0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1e0e0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
1e0f0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
1e100 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29  pPage[0])).    )
1e110 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
1e120 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1e130 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
1e140 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e150 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  }..  pRoot = pCu
1e160 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
1e170 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
1e180 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
1e190 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  oot );.  pCur->i
1e1a0 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Page = 0;.  pCur
1e1b0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
1e1c0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1e1d0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1e1e0 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
1e1f0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1e200 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0;..  if( pRoot-
1e210 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
1e220 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
1e230 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
1e240 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
1e250 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20  ->pgno==1 );.   
1e260 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
1e270 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
1e280 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
1e290 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
1e2a0 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b  rt( subpage>0 );
1e2b0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1e2c0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
1e2d0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1e2e0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
1e2f0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
1e300 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1e310 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c   = ((pRoot->nCel
1e320 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
1e330 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
1e340 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e350 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1e360 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1e370 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
1e380 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1e390 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
1e3a0 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
1e3b0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1e3c0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
1e3d0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
1e3e0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
1e3f0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
1e400 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
1e410 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1e420 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1e430 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1e440 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1e450 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1e460 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e470 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
1e480 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1e490 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1e4a0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1e4b0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e4c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e4d0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
1e4e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
1e4f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1e500 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e510 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
1e520 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1e530 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1e540 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1e550 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1e560 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1e570 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
1e580 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
1e590 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1e5a0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1e5b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e5c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1e5d0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1e5e0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
1e5f0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1e600 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
1e610 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
1e620 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1e630 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
1e640 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
1e650 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
1e660 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
1e670 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
1e680 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
1e690 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
1e6a0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
1e6b0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
1e6c0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
1e6d0 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
1e6e0 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
1e6f0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1e700 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
1e710 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
1e720 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
1e730 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
1e740 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
1e750 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
1e760 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1e770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1e780 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
1e790 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1e7a0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
1e7b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e7c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1e7d0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
1e7e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e7f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e800 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e810 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e820 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1e830 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1e840 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1e850 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e860 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
1e870 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
1e880 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1e890 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1e8a0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
1e8b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1e8c0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1e8d0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1e8e0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1e8f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1e900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e910 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1e920 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
1e930 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
1e940 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1e950 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
1e960 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1e970 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e980 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1e990 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
1e9a0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1e9b0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1e9c0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1e9d0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1e9e0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1e9f0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1ea00 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1ea10 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1ea20 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1ea30 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1ea40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ea50 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1ea60 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1ea70 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
1ea80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ea90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1eaa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1eab0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1eac0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1ead0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1eae0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1eaf0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1eb00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eb10 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1eb20 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1eb30 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
1eb40 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1eb50 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1eb60 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
1eb70 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1eb80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1eb90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1eba0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ebb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ebc0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
1ebd0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1ebe0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
1ebf0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1ec00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ec10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1ec20 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1ec30 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1ec40 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1ec50 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1ec60 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
1ec70 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
1ec80 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
1ec90 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
1eca0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
1ecb0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
1ecc0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1ecd0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1ece0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
1ecf0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1ed00 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1ed10 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
1ed20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1ed30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1ed40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ed50 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1ed60 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1ed70 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1ed80 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
1ed90 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
1eda0 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
1edb0 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
1edc0 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
1edd0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
1ede0 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29  & pCur->atLast )
1edf0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1ee00 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
1ee10 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
1ee20 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
1ee30 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
1ee40 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
1ee50 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
1ee60 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
1ee70 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
1ee80 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
1ee90 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
1eea0 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
1eeb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1eec0 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
1eed0 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
1eee0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
1eef0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1ef00 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
1ef10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1ef20 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1ef30 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
1ef40 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1ef50 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
1ef60 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
1ef70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ef80 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
1ef90 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1efa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1efb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
1efc0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1efd0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1efe0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1eff0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f000 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
1f010 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1f020 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1f030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1f040 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f050 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1f060 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1f070 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
1f080 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
1f090 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
1f0a0 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
1f0b0 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  K ?1:0;.    }.  
1f0c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f0d0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1f0e0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
1f0f0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
1f100 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
1f110 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1f120 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
1f130 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
1f140 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1f150 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1f160 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
1f170 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
1f180 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
1f190 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
1f1a0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
1f1b0 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
1f1c0 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
1f1d0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
1f1e0 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
1f1f0 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
1f200 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1f210 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
1f220 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1f230 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
1f240 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
1f250 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
1f260 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
1f270 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
1f280 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
1f290 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
1f2a0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
1f2b0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
1f2c0 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
1f2d0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
1f2e0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
1f2f0 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
1f300 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
1f310 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
1f320 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
1f330 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
1f340 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
1f350 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
1f360 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
1f370 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
1f380 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1f390 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
1f3a0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1f3b0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1f3c0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1f3d0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
1f3e0 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
1f3f0 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
1f400 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1f410 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1f420 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
1f430 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
1f440 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
1f450 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
1f460 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
1f470 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1f480 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1f490 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
1f4c0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
1f4d0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
1f4e0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1f4f0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1f500 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1f510 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1f520 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
1f530 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
1f540 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
1f550 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1f560 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
1f570 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1f580 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1f590 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
1f5a0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
1f5b0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
1f5c0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
1f5d0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
1f5e0 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
1f5f0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1f600 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
1f610 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
1f620 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
1f630 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
1f640 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1f650 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1f660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f670 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
1f680 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1f690 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1f6a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1f6b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1f6c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f6d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1f6e0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1f6f0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
1f700 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
1f710 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
1f720 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
1f730 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
1f740 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
1f750 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
1f760 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
1f770 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
1f780 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f790 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75  SOR_VALID && pCu
1f7a0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20  r->validNKey .  
1f7b0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
1f7c0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29  [0]->intKey .  )
1f7d0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1f7e0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
1f7f0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
1f800 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
1f810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f820 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
1f830 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72  ->atLast && pCur
1f840 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
1f850 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1f860 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
1f870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f880 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20      }.  }..  rc 
1f890 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1f8a0 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
1f8b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f8c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1f8d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f8e0 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
1f8f0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1f900 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
1f910 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70  sInit );.  if( p
1f920 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f930 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1f940 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
1f950 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1f960 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f970 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
1f980 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1f990 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
1f9a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1f9b0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c  ge[0]->intKey ||
1f9c0 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
1f9d0 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
1f9e0 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e  wr, upr;.    Pgn
1f9f0 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
1fa00 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
1fa10 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1fa20 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e  ->iPage];.    in
1fa30 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52  t c = -1;  /* pR
1fa40 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62  es return if tab
1fa50 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74  le is empty must
1fa60 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77   be -1 */.    lw
1fa70 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
1fa80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
1fa90 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
1faa0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64 78  ->intKey && pIdx
1fab0 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c 30  Key==0) || upr<0
1fac0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1fad0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1fae0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
1faf0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1fb00 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73    }.    if( bias
1fb10 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
1fb20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1fb30 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75  >iPage] = (u16)u
1fb40 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
1fb50 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
1fb60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1fb70 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f  (u16)((upr+lwr)/
1fb80 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  2);.    }.    fo
1fb90 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69 6e 74  r(;;){.      int
1fba0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
1fbb0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
1fbc0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
1fbd0 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
1fbe0 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  ge */.      u8 *
1fbf0 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
1fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
1fc20 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
1fc30 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 70 43  age */..      pC
1fc40 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1fc50 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   0;.      pCell 
1fc60 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1fc70 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
1fc80 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
1fc90 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
1fca0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
1fcb0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
1fcc0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1fcd0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
1fce0 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79         u32 dummy
1fcf0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
1fd00 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  l += getVarint32
1fd10 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a  (pCell, dummy);.
1fd20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fd30 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
1fd40 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
1fd50 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
1fd60 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
1fd70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1fd80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
1fd90 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
1fda0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
1fdb0 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
1fdc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fdd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
1fde0 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b  ellKey>intKey );
1fdf0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
1fe00 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1fe10 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
1fe20 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  NKey = 1;.      
1fe30 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
1fe40 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
1fe50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fe60 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
1fe70 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
1fe80 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38 20 62  -size is 32768 b
1fe90 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
1fea0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1feb0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
1fec0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
1fed0 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
1fee0 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
1fef0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
1ff00 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20 62 79   at most 8198 by
1ff10 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79 20 62  tes, which may b
1ff20 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
1ff30 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
1ff40 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
1ff50 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
1ff60 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
1ff70 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
1ff80 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
1ff90 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
1ffa0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
1ffb0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
1ffc0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
1ffd0 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
1ffe0 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
1fff0 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
20000 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
20010 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
20020 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
20030 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
20040 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20        int nCell 
20050 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
20060 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c 20      if( !(nCell 
20070 26 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c 6c  & 0x80) && nCell
20080 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
20090 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
200a0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
200b0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
200c0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
200d0 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
200e0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
200f0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
20100 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
20110 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
20120 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
20130 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
20140 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20   */.          c 
20150 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
20160 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
20170 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
20180 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
20190 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
201a0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
201b0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
201c0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
201d0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
201e0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
201f0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
20200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
20210 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
20220 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
20230 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
20240 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
20250 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
20260 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
20270 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
20280 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  /.          c = 
20290 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
202a0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
202b0 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
202c0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
202d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
202e0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
202f0 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
20300 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
20310 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
20320 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
20330 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
20340 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
20350 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
20360 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
20370 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
20380 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
20390 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
203a0 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
203b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
203c0 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
203d0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
203e0 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
203f0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
20400 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
20410 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
20420 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
20430 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
20440 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
20450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
20460 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
20470 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
20480 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
20490 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
204a0 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
204b0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
204c0 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
204d0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
204e0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ll );.          
204f0 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
20500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
20510 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
20520 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
20530 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
20540 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20550 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
20560 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
20570 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
20580 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
20590 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
205a0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
205b0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
205c0 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
205d0 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
205e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
205f0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
20600 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20610 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
20620 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
20630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20640 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
20650 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
20660 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
20670 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
20680 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
20690 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
206a0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
206b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
206c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
206d0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
206e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
206f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
20700 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
20710 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
20720 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
20730 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
20740 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
20750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20760 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
20770 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
20780 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
20790 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
207a0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
207b0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
207c0 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72  = (u16)((lwr+upr
207d0 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
207e0 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
207f0 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
20800 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
20810 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
20820 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
20830 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
20840 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
20850 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
20860 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
20870 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
20880 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
20890 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
208a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
208b0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
208c0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
208d0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
208e0 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
208f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
20900 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20910 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
20920 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20930 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
20940 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
20950 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
20960 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
20970 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
20980 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
20990 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
209a0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
209b0 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e  )lwr;.    pCur->
209c0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
209d0 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
209e0 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
209f0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
20a00 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
20a10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
20a20 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
20a30 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
20a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20a50 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
20a60 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
20a70 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
20a80 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
20a90 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
20aa0 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
20ab0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
20ac0 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
20ad0 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
20ae0 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
20af0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
20b00 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
20b10 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rk..*/.int sqlit
20b20 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  e3BtreeMoveto(. 
20b30 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
20b40 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
20b50 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
20b60 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
20b70 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
20b80 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
20b90 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
20ba0 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
20bb0 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
20bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
20bd0 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
20be0 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
20bf0 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
20c00 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
20c10 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
20c20 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
20c30 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
20c40 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
20c50 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
20c60 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
20c70 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c90 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
20ca0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
20cb0 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
20cc0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
20cd0 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
20ce0 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
20cf0 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
20d00 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
20d10 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
20d20 63 20 2a 2f 0a 0a 0a 20 20 69 66 28 20 70 4b 65  c */...  if( pKe
20d30 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
20d40 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74   nKey==(i64)(int
20d50 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64  )nKey );.    pId
20d60 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
20d70 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
20d80 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
20d90 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a  int)nKey, pKey,.
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dc0 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69        aSpace, si
20dd0 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20  zeof(aSpace));. 
20de0 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
20df0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
20e00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
20e10 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  {.    pIdxKey = 
20e20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  0;.  }.  rc = sq
20e30 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
20e40 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70  Unpacked(pCur, p
20e50 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69  IdxKey, nKey, bi
20e60 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28  as, pRes);.  if(
20e70 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c   pKey ){.    sql
20e80 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
20e90 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64  packedRecord(pId
20ea0 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  xKey);.  }.  ret
20eb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
20ec0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
20ed0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
20ee0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
20ef0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
20f00 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
20f10 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
20f20 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
20f30 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
20f40 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
20f50 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
20f60 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
20f70 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
20f80 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
20f90 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
20fa0 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
20fb0 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
20fc0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
20fd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20fe0 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
20ff0 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
21000 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
21010 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
21020 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
21030 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
21040 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
21050 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
21060 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
21070 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
21080 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
21090 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
210a0 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
210b0 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
210c0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
210d0 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
210e0 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
210f0 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
21100 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
21110 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
21120 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
21130 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
21140 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
21150 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
21160 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
21170 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
21180 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
21190 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
211a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
211b0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
211c0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
211d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
211e0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
211f0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
21200 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
21210 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
21220 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
21230 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21240 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
21250 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
21260 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
21270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21280 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
21290 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
212a0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
212b0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
212c0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
212d0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
212e0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
212f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
21300 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20  f( pCur->skip>0 
21310 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
21320 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
21330 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
21340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21350 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
21360 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
21370 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21380 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
21390 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
213a0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
213b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
213c0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
213d0 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65   idx<=pPage->nCe
213e0 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
213f0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
21400 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
21410 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e   = 0;.  if( idx>
21420 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
21430 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
21440 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
21450 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
21460 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
21470 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
21480 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
21490 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
214a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
214b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
214c0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
214d0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
214e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
214f0 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
21500 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
21510 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
21520 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
21530 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
21540 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
21550 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
21560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
21580 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
21590 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
215a0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
215b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
215c0 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
215d0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
215e0 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
215f0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
21600 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
21610 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
21620 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21630 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
21640 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
21650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
21660 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21670 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
21680 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
21690 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
216a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
216b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
216c0 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
216d0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
216e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
216f0 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
21700 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
21710 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
21720 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
21730 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
21740 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
21750 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
21760 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
21770 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
21780 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
21790 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
217a0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
217b0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
217c0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
217d0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
217e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
217f0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
21800 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
21810 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
21820 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
21830 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
21840 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21850 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
21860 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
21870 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
21880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21890 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
218a0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61    }.  pCur->atLa
218b0 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55  st = 0;.  if( CU
218c0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
218d0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
218e0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
218f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21900 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
21910 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20  r->skip<0 ){.   
21920 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
21930 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
21940 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21950 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
21960 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70  ->skip = 0;..  p
21970 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
21980 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
219a0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
219b0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
219c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
219d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
219e0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
219f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
21a00 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
21a10 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
21a20 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
21a30 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
21a40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
21a50 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
21a60 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
21a70 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
21a80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21a90 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
21aa0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
21ab0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
21ac0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
21ad0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
21ae0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
21af0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
21b00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
21b20 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
21b30 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
21b40 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66   }.    pCur->inf
21b50 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
21b60 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
21b70 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d   = 0;..    pCur-
21b80 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21b90 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
21ba0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
21bb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
21bc0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
21bd0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
21be0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
21bf0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
21c00 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
21c10 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
21c20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21c30 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
21c40 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
21c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21c60 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
21c70 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
21c80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
21c90 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
21ca0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
21cb0 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
21cc0 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
21cd0 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
21ce0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
21cf0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
21d00 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
21d10 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
21d20 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
21d30 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
21d40 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
21d50 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
21d60 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
21d70 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
21d80 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
21d90 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
21da0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
21db0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
21dc0 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
21dd0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
21de0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
21df0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
21e00 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
21e10 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
21e20 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
21e30 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
21e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
21e50 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
21e60 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
21e70 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
21e80 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
21e90 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
21ea0 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c  0, then a (feebl
21eb0 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  e) effort is mad
21ec0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
21ed0 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
21ee0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
21ef0 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
21f00 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
21f10 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
21f20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
21f30 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
21f40 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
21f50 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
21f60 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
21f70 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
21f80 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
21f90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61  *.** If the "exa
21fa0 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  ct" parameter is
21fb0 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20   not 0, and the 
21fc0 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72  page-number near
21fd0 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e  by exists .** an
21fe0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
21ff0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
22000 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
22010 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54  o be returned. T
22020 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75  his.** is only u
22030 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
22040 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65  um databases whe
22050 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  n allocating a n
22060 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ew table..*/.sta
22070 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
22080 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
22090 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d  hared *pBt, .  M
220a0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
220b0 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c   .  Pgno *pPgno,
220c0 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c   .  Pgno nearby,
220d0 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20  .  u8 exact.){. 
220e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
220f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
22100 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t n;     /* Numb
22110 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
22120 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
22130 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   int k;     /* N
22140 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
22150 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
22160 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
22170 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
22180 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
22190 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
221a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
221b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
221c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
221d0 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
221e0 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74  Page1;.  n = get
221f0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
22200 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28  Data[36]);.  if(
22210 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
22220 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
22230 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
22240 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
22250 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
22260 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
22270 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
22280 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
22290 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
222a0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
222b0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
222c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
222d0 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
222e0 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
222f0 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
22300 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
22310 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
22320 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
22330 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
22340 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
22350 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
22360 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
22370 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
22380 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
22390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
223a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
223b0 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
223c0 61 72 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63  arby<=pagerPagec
223d0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
223e0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
223f0 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
22400 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  y>0 );.      ass
22410 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
22420 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63  cuum );.      rc
22430 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
22440 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
22450 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
22460 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
22470 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
22480 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
22490 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72   ){.        sear
224a0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
224b0 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f    }.      *pPgno
224c0 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d   = nearby;.    }
224d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
224e0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
224f0 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
22500 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
22510 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
22520 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
22530 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
22540 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
22550 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
22560 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
22570 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
22580 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
22590 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
225a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
225b0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
225c0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
225d0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
225e0 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
225f0 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
22600 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
22610 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
22620 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
22630 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
22640 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
22650 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
22660 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
22670 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
22680 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
22690 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a  by' is located..
226a0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
226b0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
226c0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
226d0 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
226e0 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  ){.        iTrun
226f0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
22700 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
22710 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
22720 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
22730 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
22740 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
22750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22760 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22770 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
22780 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
22790 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
227a0 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
227b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
227c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
227d0 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  page;.      }.. 
227e0 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
227f0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
22800 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
22810 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
22820 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
22830 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
22840 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
22850 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
22860 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
22870 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
22880 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
22890 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
228a0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
228b0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
228c0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
228d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
228e0 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
228f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
22900 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
22910 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
22920 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
22930 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
22940 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
22950 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
22960 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
22970 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
22980 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
22990 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
229a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
229b0 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
229c0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
229d0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
229e0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
229f0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
22a00 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
22a10 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
22a20 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
22a30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70     }else if( k>p
22a40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
22a50 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20   - 2 ){.        
22a60 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
22a70 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
22a80 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
22a90 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
22aa0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22ab0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
22ac0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
22ad0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
22ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22af0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
22b00 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
22b10 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54  st && nearby==iT
22b20 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
22b30 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
22b40 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
22b50 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
22b60 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
22b70 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
22b80 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
22b90 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
22ba0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
22bb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
22bc0 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54  sert( *pPgno==iT
22bd0 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  runk );.        
22be0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
22bf0 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
22c00 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
22c10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22c20 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
22c30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
22c40 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
22c50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
22c60 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
22c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22c80 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
22c90 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
22ca0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
22cb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
22cc0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
22cd0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
22ce0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
22cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22d00 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
22d10 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
22d20 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
22d30 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
22d40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
22d50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
22d60 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
22d70 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
22d80 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
22d90 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
22da0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
22db0 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
22dc0 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
22dd0 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
22de0 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
22df0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
22e00 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
22e10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
22e20 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
22e30 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
22e40 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
22e50 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
22e60 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
22e70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
22e80 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22e90 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
22ea0 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
22eb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22ec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22ed0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
22ee0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
22ef0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22f00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22f10 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
22f20 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
22f30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
22f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22f50 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
22f60 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
22f70 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
22f80 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
22f90 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
22fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
22fb0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
22fc0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
22fd0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
22fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
22ff0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
23000 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
23010 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
23020 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
23030 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
23040 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
23050 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
23060 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
23070 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
23080 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
23090 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
230a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
230b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
230c0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
230d0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
230e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
230f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
23100 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
23110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23120 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23130 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
23140 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
23150 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
23160 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
23170 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
23180 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
23190 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
231a0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
231b0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
231c0 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
231d0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
231e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
231f0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
23200 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
23210 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
23220 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
23230 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
23240 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
23250 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
23260 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
23270 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
23280 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
23290 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a     int closest;.
232a0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
232b0 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
232c0 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
232d0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
232e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
232f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
23300 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
23310 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23320 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
23330 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
23340 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
23350 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
23360 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
23370 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a     int i, dist;.
23380 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
23390 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
233a0 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65   dist = get4byte
233b0 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
233c0 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
233d0 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73  if( dist<0 ) dis
233e0 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20  t = -dist;.     
233f0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
23400 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
23410 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65       int d2 = ge
23420 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
23430 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  i*4]) - nearby;.
23440 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23450 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b  d2<0 ) d2 = -d2;
23460 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23470 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
23480 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
23490 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
234a0 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
234b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
234c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
234d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
234e0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
234f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
23500 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
23510 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
23520 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
23530 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
23540 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72  t || iPage==near
23550 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
23560 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
23570 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50           Pgno nP
23580 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  age;.          *
23590 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
235a0 20 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d           nPage =
235b0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
235c0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pBt);.          
235d0 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65  if( *pPgno>nPage
235e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
235f0 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66  /* Free page off
23600 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23610 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
23620 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23630 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23640 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
23650 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
23660 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23670 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
23680 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
23690 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
236a0 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
236c0 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
236d0 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
236e0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
236f0 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
23700 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
23710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23720 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
23730 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
23740 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
23750 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
23760 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
23770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23780 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
23790 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
237a0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
237b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
237c0 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  able(pTrunk->pDb
237d0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
237e0 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21     noContent = !
237f0 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
23800 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b  nt(pBt, *pPgno);
23810 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23820 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
23830 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
23840 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
23850 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
23860 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23880 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23890 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
238a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
238b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
238c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
238d0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
238e0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
238f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23910 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
23920 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
23930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
23940 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
23950 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
23960 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
23970 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
23980 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
23990 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
239a0 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
239b0 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
239c0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
239d0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
239e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
239f0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
23a00 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
23a10 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  Bt);.    *pPgno 
23a20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20  = nPage + 1;..  
23a30 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
23a40 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
23a50 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 28 2a  pBt) ){.      (*
23a60 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a  pPgno)++;.    }.
23a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23a80 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
23a90 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
23aa0 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
23ab0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70  P_ISPAGE(pBt, *p
23ac0 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f  Pgno) ){.      /
23ad0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
23ae0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
23af0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
23b00 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
23b10 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
23b20 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
23b30 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
23b40 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
23b50 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
23b60 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
23b70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
23b80 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
23b90 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
23ba0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
23bb0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
23bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
23bd0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
23be0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
23bf0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
23c00 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  age)\n", *pPgno)
23c10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23c20 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
23c30 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
23c40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
23c50 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
23c60 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 26  e(pBt, *pPgno, &
23c70 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  pPg, 0);.      i
23c80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23c90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23cb0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
23cc0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
23cd0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
23ce0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
23cf0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
23d00 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
23d10 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
23d20 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
23d30 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50  AGE(pBt) ){ (*pP
23d40 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  gno)++; }.    }.
23d50 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65  #endif..    asse
23d60 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
23d70 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
23d80 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  t) );.    rc = s
23d90 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
23da0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
23db0 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
23dc0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
23dd0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
23de0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
23df0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
23e00 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
23e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23e20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
23e30 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
23e40 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
23e50 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
23e60 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
23e70 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
23e80 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
23e90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
23ea0 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
23eb0 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
23ec0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
23ed0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
23ee0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
23ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23f00 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
23f10 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
23f20 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
23f30 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
23f40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
23f50 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
23f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23f70 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
23f80 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
23f90 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
23fa0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23fb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
23fc0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
23fd0 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
23fe0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
23ff0 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
24000 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
24010 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
24020 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
24030 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
24040 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
24050 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
24060 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
24070 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
24080 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
24090 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
240a0 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
240b0 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
240c0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
240d0 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
240e0 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
240f0 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
24100 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
24110 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
24120 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
24130 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
24140 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
24150 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
24160 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
24170 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
24180 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
24190 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
241a0 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
241b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
241c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
241d0 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
241e0 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
241f0 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
24200 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
24210 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24230 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
24240 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
24250 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24270 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
24280 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
24290 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
242a0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
242b0 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
242c0 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
242d0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
242e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
242f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
24300 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
24310 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
24320 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
24330 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
24360 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
24390 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
243a0 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
243b0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
243c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
243d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
243e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67  ;.  assert( iPag
243f0 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
24400 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
24410 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
24420 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d  age );..  if( pM
24430 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
24440 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
24450 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24460 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
24470 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
24480 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
24490 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
244a0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
244b0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
244c0 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
244d0 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
244e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
244f0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
24500 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
24510 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
24520 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
24530 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
24540 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
24550 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
24560 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
24570 65 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  e+1);..#ifdef SQ
24580 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
24590 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  TE.  /* If the S
245a0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
245b0 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ETE compile-time
245c0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
245d0 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c  ed, then.  ** al
245e0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
245f0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
24600 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
24610 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ros..  */.  if( 
24620 28 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d  (!pPage && (rc =
24630 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
24640 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
24650 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20   &pPage, 0))).  
24660 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
24670 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24680 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
24690 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20  bPage)).  ){.   
246a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
246b0 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ut;.  }.  memset
246c0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
246d0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
246e0 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
246f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
24700 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
24710 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
24720 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
24730 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
24740 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
24750 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
24760 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
24770 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
24780 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
24790 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
247a0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
247b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
247c0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
247d0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
247e0 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
247f0 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
24800 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
24810 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
24820 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
24830 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
24840 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
24850 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
24860 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
24870 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
24880 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
24890 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
248a0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
248b0 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
248c0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
248d0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
248e0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
248f0 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
24900 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
24910 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
24920 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
24930 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
24940 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
24950 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
24960 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
24970 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
24980 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
24990 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61   ){.    int nLea
249a0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
249b0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
249c0 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
249d0 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
249e0 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
249f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
24a00 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
24a10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
24a20 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
24a30 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
24a40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24a50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24a60 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
24a70 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
24a80 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
24a90 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
24aa0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
24ab0 6e 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20  nLeaf<0 ){.     
24ac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
24ad0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
24ae0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
24af0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
24b00 28 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61  ( nLeaf<pBt->usa
24b10 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
24b20 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
24b30 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
24b40 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
24b50 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
24b60 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
24b70 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
24b80 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
24b90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
24ba0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
24bb0 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
24bc0 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
24bd0 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
24be0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
24bf0 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
24c00 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
24c10 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
24c20 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
24c30 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
24c40 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
24c50 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
24c60 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
24c70 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
24c80 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
24c90 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
24ca0 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
24cb0 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
24cc0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
24cd0 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
24ce0 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
24cf0 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
24d00 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
24d10 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
24d20 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
24d30 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
24d40 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
24d50 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
24d60 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69  ontain to restri
24d70 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
24d80 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
24d90 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
24da0 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
24db0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
24dc0 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
24dd0 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
24de0 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
24df0 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
24e00 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
24e10 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
24e20 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
24e30 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
24e40 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
24e50 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
24e60 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
24e70 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
24e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24e90 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
24ea0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
24eb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24ec0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
24ed0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
24ee0 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
24ef0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
24f00 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
24f10 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
24f20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20  iPage);.#ifndef 
24f30 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
24f40 4c 45 54 45 0a 20 20 20 20 20 20 20 20 69 66 28  LETE.        if(
24f50 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20   pPage ){.      
24f60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24f70 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
24f80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
24f90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
24fa0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
24fb0 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
24fc0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
24fd0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
24fe0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
24ff0 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
25000 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
25010 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
25020 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
25030 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
25040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
25050 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
25060 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
25070 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
25080 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
25090 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
250a0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
250b0 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
250c0 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
250d0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
250e0 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
250f0 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
25100 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
25110 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
25120 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
25130 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
25140 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
25150 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
25160 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
25170 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
25180 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
25190 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
251a0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
251b0 0a 20 20 69 66 28 20 20 20 28 28 21 70 50 61 67  .  if(   ((!pPag
251c0 65 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20  e) && (0 != (rc 
251d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
251e0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
251f0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a  , &pPage, 0)))).
25200 20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72       || (0 != (r
25210 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25220 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
25230 50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20  Page))).  ){.   
25240 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
25250 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
25260 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
25270 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
25280 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
25290 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
252a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
252b0 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
252c0 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
252d0 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
252e0 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
252f0 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
25300 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
25310 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
25320 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
25330 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
25340 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
25350 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
25360 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
25370 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
25380 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
25390 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
253a0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
253b0 75 72 6e 20 66 72 65 65 50 61 67 65 32 28 70 50  urn freePage2(pP
253c0 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
253d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d   pPage->pgno);.}
253e0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
253f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
25400 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25410 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
25420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
25430 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
25440 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
25450 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
25460 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
25470 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
25480 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
25490 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
254a0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
254b0 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c  Ovfl;.  u16 ovfl
254c0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
254d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
254e0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
254f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
25500 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
25510 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
25520 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
25530 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
25540 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
25550 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
25560 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
25570 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
25580 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
25590 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
255a0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
255b0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
255c0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
255d0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
255e0 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
255f0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
25600 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
25610 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
25620 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
25630 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
25640 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
25650 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
25660 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
25670 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
25680 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
25690 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
256a0 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
256b0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
256c0 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
256d0 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61  2 || ovflPgno>pa
256e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
256f0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
25700 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
25710 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
25720 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
25730 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
25740 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
25750 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
25760 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
25770 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
25780 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
25790 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
257a0 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
257b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
257c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
257d0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
257e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
257f0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
25800 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
25810 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
25820 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
25830 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
25840 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
25850 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
25860 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  flPgno);.    if(
25870 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
25880 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
25890 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
258a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
258b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
258c0 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
258d0 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
258e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
258f0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
25900 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
25910 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
25920 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
25930 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
25940 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
25950 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
25960 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
25970 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
25980 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
25990 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
259a0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
259b0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
259c0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
259d0 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
259e0 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
259f0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
25a00 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
25a10 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
25a20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
25a30 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
25a40 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
25a50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
25a60 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
25a70 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
25a80 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
25a90 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
25aa0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
25ab0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
25ac0 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
25ad0 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
25ae0 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
25af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25b00 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
25b10 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b30 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
25b40 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
25b50 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
25b60 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
25b70 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
25b80 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
25b90 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
25ba0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
25bb0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
25bc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
25bd0 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
25be0 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
25bf0 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c10 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
25c20 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
25c30 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
25c40 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
25c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25c60 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
25c70 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
25c80 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
25c90 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
25ca0 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
25cb0 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
25cc0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
25cd0 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
25ce0 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
25cf0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
25d00 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
25d10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
25d20 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
25d30 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
25d40 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
25d50 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
25d60 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
25d70 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
25d80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25d90 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
25da0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
25db0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
25dc0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
25dd0 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
25de0 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
25df0 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
25e00 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
25e10 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
25e20 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
25e30 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
25e40 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
25e50 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
25e60 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
25e70 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
25e80 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
25e90 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
25ea0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
25eb0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
25ec0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
25ed0 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
25ee0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
25ef0 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
25f00 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
25f10 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
25f20 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
25f30 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
25f40 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
25f50 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
25f60 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
25f70 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
25f80 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
25f90 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
25fa0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
25fb0 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  )&nKey);.  sqlit
25fc0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
25fd0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
25fe0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
25ff0 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72  rt( info.nHeader
26000 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61  ==nHeader );.  a
26010 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
26020 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ==nKey );.  asse
26030 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d  rt( info.nData==
26040 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72  (u32)(nData+nZer
26050 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  o) );.  .  /* Fi
26060 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
26070 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
26080 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
26090 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
260a0 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
260b0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
260c0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
260d0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
260e0 73 65 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65  se{ .    if( nKe
260f0 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
26100 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pKey==0 ){.     
26110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26120 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
26130 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
26140 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
26150 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
26160 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
26170 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
26180 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
26190 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
261a0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
261b0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
261c0 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
261d0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
261e0 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
261f0 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
26200 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
26210 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
26220 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26230 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
26240 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
26250 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
26260 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
26270 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
26280 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
26290 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
262a0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
262b0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
262c0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
262d0 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
262e0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
262f0 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
26300 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
26310 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
26320 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
26330 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
26340 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
26350 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
26360 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
26370 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
26380 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26390 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
263a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
263b0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
263c0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
263d0 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
263e0 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
263f0 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
26400 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
26410 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
26420 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
26430 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
26440 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
26450 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
26460 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
26470 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
26480 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
26490 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
264a0 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
264b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
264c0 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
264d0 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
264e0 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
264f0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
26500 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
26510 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
26520 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
26530 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
26540 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
26550 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
26560 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
26570 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
26580 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
26590 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
265a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
265b0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
265c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
265d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
265e0 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
265f0 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
26600 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
26610 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
26620 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
26630 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
26640 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29  ype, pgnoPtrmap)
26650 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
26670 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
26680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26690 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
266a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
266b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
266c0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
266d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
266e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
266f0 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
26700 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
26710 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
26720 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
26730 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
26740 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
26750 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
26760 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
26770 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
26780 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
26790 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
267a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
267b0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
267c0 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
267d0 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
267e0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
267f0 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
26800 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
26810 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
26820 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
26830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
26840 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
26850 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
26860 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
26870 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
26880 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
26890 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
268a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
268b0 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
268c0 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
268d0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
268e0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
268f0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
26900 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
26910 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
26920 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
26930 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
26940 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
26950 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
26960 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
26970 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
26980 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
26990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
269a0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
269b0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
269c0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
269d0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
269e0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
269f0 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
26a00 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
26a10 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
26a20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
26a30 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
26a40 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
26a50 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
26a60 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
26a70 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
26a80 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
26a90 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
26aa0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
26ab0 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
26ac0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
26ad0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
26ae0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
26af0 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
26b00 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
26b10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
26b20 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
26b30 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
26b40 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
26b50 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
26b60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
26b70 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
26b80 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
26b90 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
26ba0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
26bb0 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
26bc0 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
26bd0 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
26be0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
26bf0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
26c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26c10 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
26c20 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
26c30 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
26c40 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
26c50 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
26c60 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
26c70 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
26c80 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
26c90 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
26ca0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
26cb0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
26cc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
26cd0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
26ce0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
26cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26d00 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
26d10 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
26d20 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
26d30 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
26d40 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
26d50 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
26d60 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
26d70 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
26d80 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
26d90 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
26da0 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
26db0 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
26dc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
26dd0 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
26de0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
26df0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
26e00 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
26e10 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
26e20 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
26e30 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
26e40 20 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65   int dropCell(Me
26e50 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
26e60 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a  t idx, int sz){.
26e70 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
26e80 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
26e90 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
26ea0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
26eb0 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
26ec0 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
26ed0 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
26ee0 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
26ef0 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
26f00 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
26f10 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
26f20 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
26f30 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
26f40 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
26f50 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
26f60 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
26f70 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
26f80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
26f90 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
26fa0 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
26fb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
26fc0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
26fd0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
26fe0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
26ff0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
27000 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
27010 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
27020 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
27030 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61  ata;.  ptr = &da
27040 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
27050 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20  fset + 2*idx];. 
27060 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
27070 74 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70  tr);.  if( (pc<p
27080 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
27090 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30  6+(pPage->leaf?0
270a0 3a 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63  :4)).     || (pc
270b0 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  +sz>pPage->pBt->
270c0 75 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20  usableSize) ){. 
270d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
270e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
270f0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
27100 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
27110 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  z);.  if( rc!=SQ
27120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
27130 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
27140 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
27150 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
27160 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
27170 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
27180 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
27190 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
271a0 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
271b0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
271c0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
271d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
271e0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
271f0 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 2;.  return SQ
27200 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
27210 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
27220 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
27230 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
27240 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
27250 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
27260 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
27270 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
27280 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
27290 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
272a0 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
272b0 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
272c0 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
272d0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
272e0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
272f0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
27300 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
27310 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
27320 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
27330 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
27340 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d  n pPage->aOvfl[]
27350 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
27360 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
27370 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
27380 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
27390 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
273a0 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
273b0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
273c0 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
273d0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
273e0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
273f0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
27400 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
27410 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
27420 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
27430 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
27440 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
27450 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
27460 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
27470 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
27480 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
27490 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
274a0 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
274b0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
274c0 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
274d0 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
274e0 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
274f0 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
27500 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
27510 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
27520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27530 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
27540 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
27550 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
27560 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
27570 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
27580 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
27590 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
275a0 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
275b0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
275c0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
275d0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
275e0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
275f0 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
27600 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
27610 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
27620 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
27630 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
27640 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
27650 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
27660 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20  /.  u8 nSkip    
27670 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
27680 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  write the first 
27690 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
276a0 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  he cell */.){.  
276b0 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
276c0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
276d0 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
276e0 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
276f0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
27700 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
27710 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
27720 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
27730 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f  First byte of co
27740 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65  ntent for any ce
27750 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ll in data[] */.
27760 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
27770 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
27780 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
27790 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
277a0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
277b0 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
277c0 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
277d0 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
277e0 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
277f0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ted */.  int hdr
27800 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
27810 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d  fset into data[]
27820 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61   of the page hea
27830 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
27840 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
27850 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
27860 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
27870 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
27880 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
27890 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
278a0 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
278b0 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
278c0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
278d0 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
278e0 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
278f0 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ta[] */..  asser
27900 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
27910 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
27920 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
27930 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27940 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
27950 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
27960 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
27970 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73  )<=5460 );.  ass
27980 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
27990 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
279a0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29  (pPage->aOvfl) )
279b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
279c0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
279d0 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61  e, pCell) );.  a
279e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
279f0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
27a00 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
27a10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
27a20 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
27a30 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
27a40 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
27a50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
27a60 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
27a70 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
27a80 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
27a90 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
27aa0 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
27ab0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
27ac0 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
27ad0 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
27ae0 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
27af0 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  aOvfl[0])) );.  
27b00 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
27b10 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ].pCell = pCell;
27b20 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
27b30 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29  l[j].idx = (u16)
27b40 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  i;.    pPage->nF
27b50 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
27b60 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
27b70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27b80 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
27b90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
27ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27bc0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
27bd0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
27be0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
27bf0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
27c00 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
27c10 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ;.    hdr = pPag
27c20 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
27c30 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
27c40 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
27c50 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
27c60 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
27c70 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
27c80 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
27c90 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20  ge->nCell + 2;. 
27ca0 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66     ins = cellOff
27cb0 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69  set + 2*i;.    i
27cc0 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73  f( end > top - s
27cd0 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  z ){.      rc = 
27ce0 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
27cf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
27d00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27d10 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
27d20 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
27d30 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
27d40 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
27d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
27d60 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29  nd + sz <= top )
27d70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20  ;.    }.    idx 
27d80 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
27d90 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20  pPage, sz);.    
27da0 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b  assert( idx>0 );
27db0 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64  .    assert( end
27dc0 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61   <= get2byte(&da
27dd0 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
27de0 20 20 69 66 20 28 69 64 78 2b 73 7a 20 3e 20 70    if (idx+sz > p
27df0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
27e00 65 53 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 72  eSize) {.      r
27e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
27e20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
27e30 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
27e40 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
27e50 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20  nFree -= 2;.    
27e60 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
27e70 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e  +nSkip], pCell+n
27e80 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
27e90 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32  .    for(j=end-2
27ea0 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20  , ptr=&data[j]; 
27eb0 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72  j>ins; j-=2, ptr
27ec0 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b  -=2){.      ptr[
27ed0 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20  0] = ptr[-2];.  
27ee0 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
27ef0 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [-1];.    }.    
27f00 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
27f10 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  ns], idx);.    p
27f20 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
27f30 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
27f40 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
27f50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27f60 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
27f70 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
27f80 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
27f90 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
27fa0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
27fb0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
27fc0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
27fd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
27fe0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
27ff0 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
28000 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
28010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65       */.      Ce
28020 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
28030 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
28040 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
28050 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
28060 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28070 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
28080 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
28090 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
280a0 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20  Payload );.     
280b0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
280c0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50  low ){.        P
280d0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
280e0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
280f0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
28100 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
28110 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
28120 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  Bt, pgnoOvfl, PT
28130 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
28140 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
28150 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28160 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
28170 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
28180 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
28190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
281a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
281b0 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
281c0 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
281d0 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
281e0 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
281f0 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
28200 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
28210 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
28220 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
28230 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
28240 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
28250 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
28260 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
28270 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
28280 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
28290 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
282a0 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
282b0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
282c0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
282d0 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
282e0 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
282f0 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
28300 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
28310 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
28320 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
28330 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
28340 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
28350 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
28360 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
28370 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
28380 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
28390 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
283a0 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
283b0 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
283c0 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
283d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
283e0 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
283f0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
28400 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
28410 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
28420 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
28430 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
28440 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
28450 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
28460 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
28470 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
28480 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
28490 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
284a0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
284b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
284c0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
284d0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
284e0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
284f0 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f  =0 && nCell<=MX_
28500 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
28510 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
28520 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
28530 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28540 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
28550 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
28560 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  e) );..  /* Chec
28570 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
28580 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65  has just been ze
28590 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65  roed by zeroPage
285a0 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  () */.  assert( 
285b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
285c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74  );.  assert( get
285d0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
285e0 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a  5])==nUsable );.
285f0 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 64  .  pCellptr = &d
28600 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
28610 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
28620 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e  ;.  cellbody = n
28630 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d  Usable;.  for(i=
28640 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  nCell-1; i>=0; i
28650 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70 74  --){.    pCellpt
28660 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c  r -= 2;.    cell
28670 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69 5d  body -= aSize[i]
28680 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
28690 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64  Cellptr, cellbod
286a0 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  y);.    memcpy(&
286b0 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
286c0 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65  apCell[i], aSize
286d0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32  [i]);.  }.  put2
286e0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
286f0 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  ], nCell);.  put
28700 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
28710 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  5], cellbody);. 
28720 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
28730 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61   (nCell*2 + nUsa
28740 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b  ble - cellbody);
28750 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
28760 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a  = (u16)nCell;.}.
28770 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
28780 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
28790 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
287a0 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
287b0 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
287c0 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
287d0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
287e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
287f0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
28800 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
28810 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
28820 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
28830 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
28840 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
28850 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
28860 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
28870 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
28880 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
28890 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
288a0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
288b0 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
288c0 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
288d0 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
288e0 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
288f0 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
28900 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
28910 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
28920 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
28930 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
28940 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
28950 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
28960 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
28970 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
28980 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
28990 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
289a0 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
289b0 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
289c0 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
289d0 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
289e0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
289f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
28a00 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
28a10 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
28a20 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
28a30 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
28a40 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
28a50 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
28a60 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
28a70 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
28a80 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
28a90 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b  BtCursor*, int);
28aa0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28ab0 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
28ac0 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
28ad0 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
28ae0 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
28af0 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
28b00 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
28b10 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
28b20 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
28b30 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
28b40 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
28b50 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
28b60 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
28b70 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
28b80 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
28b90 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
28ba0 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
28bb0 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61  d of trying bala
28bc0 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
28bd0 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
28be0 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
28bf0 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
28c00 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
28c10 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
28c20 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
28c30 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
28c40 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
28c50 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
28c60 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
28c70 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
28c80 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
28c90 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
28ca0 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
28cb0 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
28cc0 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
28cd0 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
28ce0 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
28cf0 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
28d00 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
28d10 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
28d20 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
28d30 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
28d40 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
28d50 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
28d60 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
28d70 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
28d80 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
28d90 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
28da0 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
28db0 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
28dc0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
28dd0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
28de0 69 63 6b 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ick(BtCursor *pC
28df0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
28e00 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
28e10 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   0;.  Pgno pgnoN
28e20 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ew;.  u8 *pCell;
28e30 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20  .  u16 szCell;. 
28e40 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
28e50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
28e60 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
28e70 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
28e80 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
28e90 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
28ea0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a  pCur->iPage-1];.
28eb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
28ec0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
28ed0 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20  int parentIdx = 
28ee0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
28ef0 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77    /* pParent new
28f00 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
28f10 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  dex */.  int par
28f20 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  entSize;        
28f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
28f40 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65  ze of new divide
28f50 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70  r cell */.  u8 p
28f60 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20  arentCell[64];  
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f80 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   Space for the n
28f90 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
28fa0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
28fb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
28fc0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
28fd0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ex) );..  /* All
28fe0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
28ff0 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65  . Insert the ove
29000 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
29010 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20  pPage.  ** into 
29020 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20  it. Then remove 
29030 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
29040 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20  l from pPage..  
29050 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
29060 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
29070 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
29080 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
29090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
290a0 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67      pCell = pPag
290b0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
290c0 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20  l;.    szCell = 
290d0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
290e0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61  e, pCell);.    a
290f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
29100 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
29110 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  New->pDbPage) );
29120 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
29130 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
29140 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  [0]);.    assemb
29150 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
29160 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
29170 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
29180 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a 20  erflow = 0;.  . 
29190 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63     /* pPage is c
291a0 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67  urrently the rig
291b0 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72  ht-child of pPar
291c0 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73  ent. Change this
291d0 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  .    ** so that 
291e0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
291f0 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  is the new page 
29200 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20  allocated above 
29210 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50 61 67 65  and.    ** pPage
29220 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d   is the next-to-
29230 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20  right child. .  
29240 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e 6f    **.    ** Igno
29250 72 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  re the return va
29260 6c 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20  lue of the call 
29270 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e  to fillInCell().
29280 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20   fillInCell().  
29290 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65    ** may only re
292a0 74 75 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  turn other than 
292b0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20  SQLITE_OK if it 
292c0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  is required to a
292d0 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20 6f  llocate.    ** o
292e0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
292f0 6c 6f 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65  low pages. Since
29300 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62   an internal tab
29310 6c 65 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a  le B-Tree cell .
29320 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72      ** may never
29330 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f   spill over onto
29340 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
29350 65 20 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d  e (it is a maxim
29360 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31 33  um of .    ** 13
29370 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c   bytes in size),
29380 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65   it is not necce
29390 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74  ssary to check t
293a0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a  he return code..
293b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69      **.    ** Si
293c0 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e 73  milarly, the ins
293d0 65 72 74 43 65 6c 6c 28 29 20 66 75 6e 63 74 69  ertCell() functi
293e0 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  on cannot fail i
293f0 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a  f the page.    *
29400 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  * being inserted
29410 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64 79   into is already
29420 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74 68   writable and th
29430 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
29440 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20  .    ** contain 
29450 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e  an overflow poin
29460 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  ter. So ignore t
29470 68 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20  his return code 
29480 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
29490 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
294a0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70 43  Cell>0 );.    pC
294b0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
294c0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
294d0 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ll-1);.    sqlit
294e0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
294f0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
29500 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66 69  , &info);.    fi
29510 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
29520 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c  , parentCell, 0,
29530 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30   info.nKey, 0, 0
29540 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65  , 0, &parentSize
29550 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29560 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a  arentSize<64 );.
29570 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
29580 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
29590 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
295a0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 69 6e 73  Page) );.    ins
295b0 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
295c0 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65   parentIdx, pare
295d0 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69  ntCell, parentSi
295e0 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70  ze, 0, 4);.    p
295f0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
29600 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
29610 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61  ,parentIdx), pPa
29620 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ge->pgno);.    p
29630 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
29640 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
29650 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
29660 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
29670 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
29680 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
29690 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
296a0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
296b0 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
296c0 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
296d0 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
296e0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
296f0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
29700 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
29710 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20 20 2a  flow page..    *
29720 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
29730 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
29740 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
29750 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
29760 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
29770 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt->pgno);.     
29780 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29790 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
297a0 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
297b0 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20  (pNew, 0);.     
297c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
297d0 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
297e0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
297f0 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
29800 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
29810 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  ;.  }..  /* At t
29820 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 50  his point the pP
29830 61 67 65 2d 3e 6e 46 72 65 65 20 76 61 72 69 61  age->nFree varia
29840 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 20 63  ble is not set c
29850 6f 72 72 65 63 74 6c 79 20 77 69 74 68 0a 20 20  orrectly with.  
29860 2a 2a 20 72 65 73 70 65 63 74 20 74 6f 20 74 68  ** respect to th
29870 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
29880 20 70 61 67 65 20 28 62 65 63 61 75 73 65 20 69   page (because i
29890 74 20 77 61 73 20 73 65 74 20 74 6f 20 30 20 62  t was set to 0 b
298a0 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43 65  y .  ** insertCe
298b0 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71 6c  ll). So call sql
298c0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
298d0 65 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  e() to make sure
298e0 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72 72   it is.  ** corr
298f0 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ect..  **.  ** T
29900 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 64 6f  his has to be do
29910 6e 65 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72  ne even if an er
29920 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
29930 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  rned. Normally, 
29940 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  if.  ** an error
29950 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
29960 72 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  ree balancing, t
29970 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d  he contents of M
29980 65 6d 50 61 67 65 20 61 72 65 0a 20 20 2a 2a 20  emPage are.  ** 
29990 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20 61  not important, a
299a0 73 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72  s they will be r
299b0 65 63 61 6c 63 75 6c 61 74 65 64 20 77 68 65 6e  ecalculated when
299c0 20 74 68 65 20 70 61 67 65 20 69 73 20 72 6f 6c   the page is rol
299d0 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 42  led.  ** back. B
299e0 75 74 20 68 65 72 65 2c 20 69 6e 20 62 61 6c 61  ut here, in bala
299f0 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20 69 74 20  nce_quick(), it 
29a00 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
29a10 20 70 50 61 67 65 20 68 61 73 20 0a 20 20 2a 2a   pPage has .  **
29a20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6d 61   not yet been ma
29a30 72 6b 65 64 20 64 69 72 74 79 20 6f 72 20 77 72  rked dirty or wr
29a40 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
29a50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
29a60 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 77  refore.  ** it w
29a70 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65  ill not be rolle
29a80 64 20 62 61 63 6b 20 61 6e 64 20 73 6f 20 69 74  d back and so it
29a90 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
29aa0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
29ab0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 64 61    ** the page da
29ac0 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73 20  ta and contents 
29ad0 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65 20 63  of MemPage are c
29ae0 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  onsistent..  */.
29af0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
29b00 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  = 0;.  sqlite3Bt
29b10 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
29b20 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
29b30 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
29b40 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76  0 );..  /* If ev
29b50 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20 73 75  erything else su
29b60 63 63 65 65 64 65 64 2c 20 62 61 6c 61 6e 63 65  cceeded, balance
29b70 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
29b80 2c 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65 20  , in .  ** case 
29b90 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
29ba0 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64   inserted caused
29bb0 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76   it to become ov
29bc0 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69  erfull..  */.  i
29bd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29be0 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
29bf0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
29c00 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
29c10 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
29c20 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pCur, 0);.  }.  
29c30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
29c40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
29c50 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
29c60 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
29c70 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
29c80 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50  utes Cells on pP
29c90 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e  age and up to NN
29ca0 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f  *2 siblings.** o
29cb0 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20  f pPage so that 
29cc0 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
29cd0 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d  bout the same am
29ce0 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
29cf0 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e  ce..** Usually N
29d00 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
29d10 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
29d20 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68  ge is used in th
29d30 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20  e balancing,.** 
29d40 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c  though more sibl
29d50 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
29d60 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66  from one side if
29d70 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69   pPage is the fi
29d80 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63  rst.** or last c
29d90 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
29da0 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61  nt.  If pPage ha
29db0 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e  s fewer than 2*N
29dc0 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73  N siblings.** (s
29dd0 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
29de0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
29df0 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72  f pPage is the r
29e00 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a  oot page or a .*
29e10 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29  * child of root)
29e20 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
29e30 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72  ble siblings par
29e40 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
29e50 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a  balancing..**.**
29e60 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   The number of s
29e70 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
29e80 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
29e90 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
29ea0 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77   by one or.** tw
29eb0 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74  o in an effort t
29ec0 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61  o keep pages nea
29ed0 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74  rly full but not
29ee0 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20   over full. The 
29ef0 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
29f00 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61  special and is a
29f10 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61  llowed to be nea
29f20 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50  rly empty. If pP
29f30 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72  age is .** the r
29f40 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
29f50 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
29f60 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e  tree might be in
29f70 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65  creased.** or de
29f80 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20  creased by one, 
29f90 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f  as necessary, to
29fa0 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70   keep the root p
29fb0 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  age from being.*
29fc0 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f  * overfull or co
29fd0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
29fe0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
29ff0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2a000 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
2a010 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f  e of the Cells o
2a020 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74  n pPage.** might
2a030 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
2a040 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
2a050 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73  ->aData[].  This
2a060 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69   can happen.** i
2a070 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76  f the page is ov
2a080 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66  erfull.  Part of
2a090 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   the job of this
2a0a0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a   routine is to.*
2a0b0 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * make sure all 
2a0c0 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20  Cells for pPage 
2a0d0 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69  once again fit i
2a0e0 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
2a0f0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
2a100 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
2a110 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ng the siblings 
2a120 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61  of pPage, the pa
2a130 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a  rent of pPage.**
2a140 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76   might become ov
2a150 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
2a160 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61  ull.  If that ha
2a170 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73  ppens, then this
2a180 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
2a190 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
2a1a0 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e  y on the parent.
2a1b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  .**.** If this r
2a1c0 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72  outine fails for
2a1d0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20   any reason, it 
2a1e0 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20  might leave the 
2a1f0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61  database.** in a
2a200 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65   corrupted state
2a210 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
2a220 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
2a230 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
2a240 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
2a250 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
2a260 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  t balance_nonroo
2a270 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2a280 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2a290 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2a2a0 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f 72    /* The over or
2a2b0 20 75 6e 64 65 72 66 75 6c 6c 20 70 61 67 65 20   underfull page 
2a2c0 74 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20  to balance */.  
2a2d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2a2e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a2f0 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  The parent of pP
2a300 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
2a310 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
2a320 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
2a330 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
2a340 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a360 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
2a370 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
2a380 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
2a390 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2a3a0 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
2a3b0 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
2a3c0 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
2a3d0 69 6e 74 20 6e 4f 6c 64 20 3d 20 30 3b 20 20 20  int nOld = 0;   
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a3f0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2a400 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
2a410 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a430 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2a440 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
2a450 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20  int nDiv;       
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a470 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
2a480 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20  in apDiv[] */.  
2a490 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a4b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2a4c0 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67  /* Index of pPag
2a4f0 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  e in pParent->aC
2a500 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
2a510 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
2a520 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
2a530 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
2a540 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
2a550 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
2a580 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c   code */.  int l
2a590 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
2a5a0 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
2a5b0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
2a5c0 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
2a5d0 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a5f0 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
2a600 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
2a610 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
2a620 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a640 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
2a650 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
2a660 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
2a670 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2a680 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
2a690 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
2a6a0 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
2a6b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a6c0 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
2a6d0 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
2a6e0 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
2a6f0 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a710 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2a720 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
2a730 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32 20  /.  int iSpace2 
2a740 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2a750 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
2a760 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 32   byte of aSpace2
2a770 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
2a780 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
2a790 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2a7a0 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
2a7b0 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
2a7c0 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
2a7d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
2a7e0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
2a7f0 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
2a800 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d  Pgno pgnoOld[NB]
2a810 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a820 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
2a830 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
2a840 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  Old[] */.  MemPa
2a850 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
2a860 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
2a870 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
2a880 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
2a890 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
2a8a0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
2a8b0 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
2a8c0 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
2a8d0 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
2a8e0 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42   Pgno pgnoNew[NB
2a8f0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  +2];          /*
2a900 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
2a910 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
2a920 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  pNew[] */.  u8 *
2a930 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20  apDiv[NB];      
2a940 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
2a950 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
2a960 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
2a970 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
2a980 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2a990 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
2a9a0 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
2a9b0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
2a9c0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
2a9d0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
2a9e0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
2a9f0 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
2aa00 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
2aa10 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2aa20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
2aa30 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
2aa40 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
2aa50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa60 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
2aa70 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
2aa80 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
2aa90 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20   *aCopy[NB];    
2aaa0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
2aab0 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f  r holding data o
2aac0 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20  f apCopy[] */.  
2aad0 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
2aae0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
2aaf0 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
2ab00 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66  viders cells bef
2ab10 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20  ore balance */. 
2ab20 20 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30   u8 *aSpace2 = 0
2ab30 3b 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65  ;       /* Space
2ab40 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69   for overflow di
2ab50 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74  viders cells aft
2ab60 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20  er balance */.  
2ab70 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a  u8 *aFrom = 0;..
2ab80 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2ab90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2aba0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ge];.  assert( s
2abb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2abc0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2abd0 74 65 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e  tex) );.  VVA_ON
2abe0 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53  LY( pCur->pagesS
2abf0 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 0a  huffled = 1 );..
2ac00 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20    /* .  ** Find 
2ac10 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2ac20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ac30 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
2ac40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ac50 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2ac60 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2ac70 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2ac80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c  age->pDbPage) ||
2ac90 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2aca0 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20  w==1 );.  pBt = 
2acb0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50  pPage->pBt;.  pP
2acc0 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70  arent = pCur->ap
2acd0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2ace0 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
2acf0 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20  Parent );.  if( 
2ad00 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2ad10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2ad20 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  te(pParent->pDbP
2ad30 61 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  age)) ){.    got
2ad40 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2ad50 70 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 28  p;.  }..  TRACE(
2ad60 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
2ad70 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
2ad80 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
2ad90 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
2ada0 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  gno));..#ifndef 
2adb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2adc0 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20  KBALANCE.  /*.  
2add0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61 73  ** A special cas
2ade0 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74  e:  If a new ent
2adf0 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ry has just been
2ae00 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61   inserted into a
2ae10 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61  .  ** table (tha
2ae20 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77 69  t is, a btree wi
2ae30 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  th integer keys 
2ae40 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20  and all data at 
2ae50 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a  the leaves).  **
2ae60 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74   and the new ent
2ae70 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ry is the right-
2ae80 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  most entry in th
2ae90 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20 74  e tree (it has t
2aea0 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  he.  ** largest 
2aeb0 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74 68  key) then use th
2aec0 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63  e special balanc
2aed0 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e  e_quick() routin
2aee0 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e  e for.  ** balan
2aef0 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71  cing.  balance_q
2af00 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66  uick() is much f
2af10 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74  aster and result
2af20 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20  s in a tighter. 
2af30 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64   ** packing of d
2af40 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ata in the commo
2af50 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  n case..  */.  i
2af60 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26  f( pPage->leaf &
2af70 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  &.      pPage->i
2af80 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70  ntKey &&.      p
2af90 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2afa0 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  =1 &&.      pPag
2afb0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  e->aOvfl[0].idx=
2afc0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  =pPage->nCell &&
2afd0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
2afe0 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20  pgno!=1 &&.     
2aff0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
2b000 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2b010 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
2b020 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20  ==pPage->pgno.  
2b030 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2b040 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
2b050 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f      /*.    ** TO
2b060 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69  DO: Check the si
2b070 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65  blings to the le
2b080 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20  ft of pPage. It 
2b090 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20  may be that.    
2b0a0 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ** they are not 
2b0b0 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20  full and no new 
2b0c0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
2b0d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
2b0e0 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  urn balance_quic
2b0f0 6b 28 70 43 75 72 29 3b 0a 20 20 7d 0a 23 65 6e  k(pCur);.  }.#en
2b100 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  dif..  if( SQLIT
2b110 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
2b120 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2b130 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29  age->pDbPage)) )
2b140 7b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  {.    goto balan
2b150 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2b160 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
2b170 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  the cell in the 
2b180 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73  parent page whos
2b190 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69  e left child poi
2b1a0 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f  nts back.  ** to
2b1b0 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64   pPage.  The "id
2b1c0 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74  x" variable is t
2b1d0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
2b1e0 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65   cell.  If pPage
2b1f0 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67  .  ** is the rig
2b200 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  htmost child of 
2b210 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74  pParent then set
2b220 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d   idx to pParent-
2b230 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69  >nCell .  */.  i
2b240 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
2b250 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
2b260 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
2b270 6e 64 65 78 28 70 50 61 72 65 6e 74 2c 20 69 64  ndex(pParent, id
2b280 78 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  x, pPage->pgno);
2b290 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
2b2a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
2b2b0 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65 20  o pPage and the 
2b2c0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2b2d0 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a   that divide.  *
2b2e0 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20  * the siblings. 
2b2f0 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
2b300 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
2b310 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65  iblings on eithe
2b320 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70  r.  ** side of p
2b330 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c  Page.  More sibl
2b340 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
2b350 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
2b360 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70  wever, if.  ** p
2b370 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20 66  Page there are f
2b380 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
2b390 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
2b3a0 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50 61  er side.  If pPa
2b3b0 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42  rent.  ** has NB
2b3c0 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72   or fewer childr
2b3d0 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c  en then all chil
2b3e0 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20  dren of pParent 
2b3f0 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a  are taken..  */.
2b400 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20    nxDiv = idx - 
2b410 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20  NN;.  if( nxDiv 
2b420 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e  + NB > pParent->
2b430 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44  nCell ){.    nxD
2b440 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43  iv = pParent->nC
2b450 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20  ell - NB + 1;.  
2b460 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20  }.  if( nxDiv<0 
2b470 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
2b480 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30  ;.  }.  nDiv = 0
2b490 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e  ;.  for(i=0, k=n
2b4a0 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c  xDiv; i<NB; i++,
2b4b0 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b   k++){.    if( k
2b4c0 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  <pParent->nCell 
2b4d0 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
2b4e0 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ] = findCell(pPa
2b4f0 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20  rent, k);.      
2b500 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73  nDiv++;.      as
2b510 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e  sert( !pParent->
2b520 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67  leaf );.      pg
2b530 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
2b540 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
2b550 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d     }else if( k==
2b560 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2b570 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  {.      pgnoOld[
2b580 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  i] = get4byte(&p
2b590 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2b5a0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2b5b0 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
2b5c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2b5d0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74    }.    rc = get
2b5e0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2b5f0 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70   pgnoOld[i], &ap
2b600 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
2b610 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2b620 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2b630 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78  /* apOld[i]->idx
2b640 50 61 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a 20  Parent = k; */. 
2b650 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30     apCopy[i] = 0
2b660 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  ;.    assert( i=
2b670 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c  =nOld );.    nOl
2b680 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c  d++;.    nMaxCel
2b690 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
2b6a0 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
2b6b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d  ->nOverflow;.  }
2b6c0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
2b6d0 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
2b6e0 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74   of 4 in order t
2b6f0 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
2b700 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
2b710 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
2b720 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33  = (nMaxCells + 3
2b730 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~3;..  /*.  **
2b740 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
2b750 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
2b760 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a 53  tures.  */.  szS
2b770 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
2b780 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2b790 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2b7b0 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
2b7c0 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2b7d0 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
2b7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2b7f0 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
2b800 28 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d  (ROUND8(sizeof(M
2b810 65 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e 70 61  emPage))+pBt->pa
2b820 67 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61  geSize)*NB  /* a
2b830 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Copy */.     + p
2b840 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20  Bt->pageSize    
2b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
2b870 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20  pace1 */.     + 
2b880 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  (ISAUTOVACUUM ? 
2b890 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b 20  nMaxCells : 0); 
2b8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2b8b0 46 72 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  From */.  apCell
2b8c0 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
2b8d0 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
2b8e0 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
2b8f0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
2b900 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2b910 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
2b920 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
2b930 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2b940 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
2b950 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d  s];.  aCopy[0] =
2b960 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d   (u8*)&szCell[nM
2b970 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65  axCells];.  asse
2b980 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2b990 4c 49 47 4e 4d 45 4e 54 28 61 43 6f 70 79 5b 30  LIGNMENT(aCopy[0
2b9a0 5d 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  ]) );.  for(i=1;
2b9b0 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<NB; i++){.   
2b9c0 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f   aCopy[i] = &aCo
2b9d0 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  py[i-1][pBt->pag
2b9e0 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
2b9f0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
2ba00 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43      assert( ((aC
2ba10 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 30 29  opy[i] - (u8*)0)
2ba20 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
2ba30 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
2ba40 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a  required */.  }.
2ba50 20 20 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f    aSpace1 = &aCo
2ba60 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61  py[NB-1][pBt->pa
2ba70 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
2ba80 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
2ba90 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2baa0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2bab0 61 53 70 61 63 65 31 29 20 29 3b 0a 20 20 69 66  aSpace1) );.  if
2bac0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2bad0 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61  {.    aFrom = &a
2bae0 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
2baf0 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70  Size];.  }.  aSp
2bb00 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61  ace2 = sqlite3Pa
2bb10 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61  geMalloc(pBt->pa
2bb20 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61  geSize);.  if( a
2bb30 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20  Space2==0 ){.   
2bb40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2bb50 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
2bb60 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2bb70 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  }.  .  /*.  ** M
2bb80 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
2bb90 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
2bba0 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2bbb0 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
2bbc0 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
2bbd0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2bbe0 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
2bbf0 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
2bc00 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
2bc10 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
2bc20 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
2bc30 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
2bc40 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
2bc50 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
2bc60 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
2bc70 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
2bc80 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
2bc90 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
2bca0 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
2bcb0 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20  *)aCopy[i];.    
2bcc0 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b  memcpy(p, apOld[
2bcd0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
2bce0 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61  ge));.    p->aDa
2bcf0 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31  ta = (void*)&p[1
2bd00 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
2bd10 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
2bd20 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
2bd30 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
2bd40 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
2bd50 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
2bd60 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
2bd70 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
2bd80 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
2bd90 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
2bda0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
2bdb0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
2bdc0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
2bdd0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
2bde0 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
2bdf0 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
2be00 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
2be10 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
2be20 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
2be30 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
2be40 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
2be50 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
2be60 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
2be70 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
2be80 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
2be90 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
2bea0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
2beb0 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
2bec0 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
2bed0 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
2bee0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2bef0 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
2bf00 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
2bf10 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
2bf20 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
2bf30 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
2bf40 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
2bf50 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
2bf60 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
2bf70 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
2bf80 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
2bf90 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
2bfa0 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
2bfb0 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
2bfc0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
2bfd0 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
2bfe0 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
2bff0 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
2c000 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
2c010 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
2c020 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
2c030 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e  y keys..  */.  n
2c040 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66  Cell = 0;.  leaf
2c050 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61  Correction = pPa
2c060 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  ge->leaf*4;.  le
2c070 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  afData = pPage->
2c080 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
2c090 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
2c0a0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
2c0b0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b  Old = apCopy[i];
2c0c0 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d  .    int limit =
2c0d0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
2c0e0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
2c0f0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
2c100 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
2c110 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
2c120 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
2c130 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
2c140 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
2c150 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20  l(pOld, j);.    
2c160 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2c170 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
2c180 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
2c190 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  ]);.      if( IS
2c1a0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2c1b0 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
2c1c0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
2c1d0 5d 20 3d 20 28 75 38 29 69 3b 20 20 20 61 73 73  ] = (u8)i;   ass
2c1e0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 36  ert( i>=0 && i<6
2c1f0 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
2c200 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76  a=0; a<pOld->nOv
2c210 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20  erflow; a++){.  
2c220 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
2c230 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c  ->aOvfl[a].pCell
2c240 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  ==apCell[nCell] 
2c250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2c260 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
2c270 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF;.            
2c280 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2c290 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2c2a0 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
2c2b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
2c2c0 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20  ( i<nOld-1 ){.  
2c2d0 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c      u16 sz = cel
2c2e0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
2c2f0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
2c300 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
2c310 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69  ){.        /* Wi
2c320 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20  th the LEAFDATA 
2c330 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65  flag, pParent ce
2c340 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e  lls hold only IN
2c350 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20  TKEYs that.     
2c360 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63     ** are duplic
2c370 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20  ates of keys on 
2c380 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e  the child pages.
2c390 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d    We need to rem
2c3a0 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ove.        ** t
2c3b0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2c3c0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62   from pParent, b
2c3d0 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20  ut the dividers 
2c3e0 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20  cells are not.  
2c3f0 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
2c400 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75  o apCell[] becau
2c410 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c  se they are dupl
2c420 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20  icates of child 
2c430 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  cells..        *
2c440 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  /.        dropCe
2c450 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
2c460 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65  v, sz);.      }e
2c470 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20  lse{.        u8 
2c480 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20  *pTemp;.        
2c490 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
2c4a0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
2c4b0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2c4c0 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70   = sz;.        p
2c4d0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
2c4e0 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
2c4f0 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
2c500 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2c510 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69   sz<=pBt->pageSi
2c520 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 20 20  ze/4 );.        
2c530 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31 3c  assert( iSpace1<
2c540 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
2c550 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
2c560 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
2c570 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  , sz);.        a
2c580 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
2c590 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
2c5a0 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ion;.        if(
2c5b0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2c5c0 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d  .          aFrom
2c5d0 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a  [nCell] = 0xFF;.
2c5e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c5f0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
2c600 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
2c610 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c620 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2c630 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74  0 || leafCorrect
2c640 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
2c650 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2c660 2d 3d 20 28 75 31 36 29 6c 65 61 66 43 6f 72 72  -= (u16)leafCorr
2c670 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
2c680 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2c690 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64  (pTemp)==pgnoOld
2c6a0 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69  [i] );.        i
2c6b0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
2c6c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2c6d0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
2c6e0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
2c6f0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2c700 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
2c710 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
2c720 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
2c730 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
2c740 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
2c750 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
2c760 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
2c770 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
2c780 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68  d->aData[pOld->h
2c790 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b  drOffset+8], 4);
2c7a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c7b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c7c0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2c7d0 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==4 );.         
2c7e0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
2c7f0 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
2c800 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
2c810 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
2c820 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
2c830 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
2c840 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2c850 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20   = 4;.          
2c860 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2c870 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
2c880 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2c890 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
2c8a0 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
2c8b0 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
2c8c0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
2c8d0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
2c8e0 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
2c8f0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
2c900 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
2c910 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
2c920 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
2c930 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
2c940 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
2c950 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
2c960 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
2c970 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
2c980 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
2c990 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
2c9a0 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
2c9b0 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
2c9c0 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
2c9d0 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
2c9e0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
2c9f0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
2ca00 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
2ca10 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2ca20 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
2ca30 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
2ca40 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
2ca50 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
2ca60 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
2ca70 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
2ca80 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
2ca90 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
2caa0 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
2cab0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
2cac0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
2cad0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
2cae0 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
2caf0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
2cb00 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2cb10 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
2cb20 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
2cb30 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
2cb40 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
2cb50 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
2cb60 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
2cb70 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
2cb80 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
2cb90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
2cba0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2cbb0 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
2cbc0 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
2cbd0 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
2cbe0 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
2cbf0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
2cc00 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
2cc10 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
2cc20 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
2cc30 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
2cc40 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
2cc50 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
2cc60 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   k++;.    }.  }.
2cc70 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
2cc80 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
2cc90 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
2cca0 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
2ccb0 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
2ccc0 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
2ccd0 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
2cce0 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
2ccf0 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
2cd00 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
2cd10 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
2cd20 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
2cd30 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
2cd40 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
2cd50 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
2cd60 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
2cd70 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
2cd80 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
2cd90 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
2cda0 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
2cdb0 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
2cdc0 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
2cdd0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
2cde0 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
2cdf0 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
2ce00 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
2ce10 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
2ce20 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
2ce30 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
2ce40 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
2ce50 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
2ce60 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
2ce70 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
2ce80 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
2ce90 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
2cea0 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
2ceb0 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
2cec0 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
2ced0 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
2cee0 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
2cef0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
2cf00 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
2cf10 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
2cf20 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
2cf30 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
2cf40 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
2cf50 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
2cf60 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2cf70 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
2cf80 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
2cf90 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cfb0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
2cfc0 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
2cfd0 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
2cfe0 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
2cff0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
2d000 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
2d010 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
2d020 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
2d030 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2d040 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
2d050 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
2d060 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
2d070 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
2d080 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
2d090 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
2d0a0 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
2d0b0 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
2d0c0 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
2d0d0 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
2d0e0 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
2d0f0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
2d100 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
2d110 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
2d120 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
2d130 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
2d140 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
2d150 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
2d160 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
2d170 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
2d180 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
2d190 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a  ) or we are the.
2d1a0 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
2d1b0 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
2d1c0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
2d1d0 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
2d1e0 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
2d1f0 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
2d200 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
2d210 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
2d220 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2d230 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
2d240 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
2d250 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
2d260 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
2d270 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
2d280 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
2d290 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
2d2a0 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
2d2b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d2c0 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
2d2d0 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
2d2e0 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
2d2f0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
2d300 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
2d310 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
2d320 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
2d330 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
2d340 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
2d350 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
2d360 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
2d370 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
2d380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2d390 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
2d3a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
2d3b0 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
2d3c0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2d3d0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
2d3e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
2d3f0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
2d400 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2d410 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
2d420 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c  ew, &pgnoNew[i],
2d430 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30   pgnoNew[i-1], 0
2d440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2d450 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2d460 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
2d470 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
2d480 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
2d490 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
2d4a0 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
2d4b0 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
2d4c0 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
2d4d0 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
2d4e0 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
2d4f0 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
2d500 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
2d510 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2d520 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
2d530 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
2d540 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
2d550 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
2d560 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2d570 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
2d580 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
2d590 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
2d5a0 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
2d5b0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
2d5c0 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
2d5d0 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
2d5e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
2d5f0 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
2d600 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
2d610 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
2d620 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
2d630 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2d640 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
2d650 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
2d660 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
2d670 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
2d680 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
2d690 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
2d6a0 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
2d6b0 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
2d6c0 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
2d6d0 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
2d6e0 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
2d6f0 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
2d700 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
2d710 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
2d720 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
2d730 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
2d740 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
2d750 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
2d760 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
2d770 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
2d780 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2d790 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
2d7a0 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
2d7b0 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
2d7c0 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
2d7d0 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
2d7e0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
2d7f0 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
2d800 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
2d810 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
2d820 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
2d830 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
2d840 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2d850 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
2d860 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
2d870 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
2d880 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
2d890 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
2d8a0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
2d8b0 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
2d8c0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
2d8d0 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
2d8e0 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
2d8f0 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
2d900 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
2d910 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
2d920 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2d930 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
2d940 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
2d950 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
2d960 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
2d970 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
2d980 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
2d990 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
2d9a0 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
2d9b0 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
2d9c0 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
2d9d0 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
2d9e0 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
2d9f0 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
2da00 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
2da10 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
2da20 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
2da30 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
2da40 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
2da50 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
2da60 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
2da70 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
2da80 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
2da90 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
2daa0 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
2dab0 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
2dac0 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
2dad0 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
2dae0 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
2daf0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
2db00 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
2db10 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
2db20 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
2db30 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
2db40 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
2db50 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
2db60 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
2db70 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
2db80 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
2db90 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
2dba0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
2dbb0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
2dbc0 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e   pNew->pgno==pgn
2dbd0 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a  oNew[i] );.    z
2dbe0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
2dbf0 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
2dc00 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
2dc10 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
2dc20 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
2dc30 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
2dc40 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
2dc50 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
2dc60 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
2dc70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2dc80 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
2dc90 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2dca0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2dcb0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2dcc0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2dcd0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
2dce0 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
2dcf0 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
2dd00 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
2dd10 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
2dd20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
2dd30 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
2dd40 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
2dd50 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
2dd60 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
2dd70 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
2dd80 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
2dd90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2dda0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2ddb0 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e     for(k=j; k<cn
2ddc0 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20  tNew[i]; k++){. 
2ddd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b         assert( k
2dde0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2ddf0 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b        if( aFrom[
2de00 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  k]==0xFF || apCo
2de10 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67  py[aFrom[k]]->pg
2de20 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
2de30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2de40 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2de50 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20  New, k-j);.     
2de60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2de70 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 6f  ITE_OK && leafCo
2de80 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20  rrection==0 ){. 
2de90 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2dea0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
2deb0 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 6b  et4byte(apCell[k
2dec0 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
2ded0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20  , pNew->pgno);. 
2dee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2def0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2df00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2df10 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2df20 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2df30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2df40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2df50 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
2df60 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
2df70 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
2df80 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
2df90 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
2dfa0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
2dfb0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
2dfc0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
2dfd0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2dfe0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2dff0 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c  ( i<nNew-1 && j<
2e000 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
2e010 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
2e020 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
2e030 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
2e040 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
2e050 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
2e060 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
2e070 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
2e080 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
2e090 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
2e0a0 6d 70 20 3d 20 26 61 53 70 61 63 65 32 5b 69 53  mp = &aSpace2[iS
2e0b0 70 61 63 65 32 5d 3b 0a 20 20 20 20 20 20 69 66  pace2];.      if
2e0c0 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
2e0d0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2e0e0 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
2e0f0 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
2e100 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2e110 43 55 55 4d 20 0a 20 20 20 20 20 20 20 20 20 26  CUUM .         &
2e120 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46  & (aFrom[j]==0xF
2e130 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
2e140 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[j]]->pgno!=pNe
2e150 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20 20  w->pgno).       
2e160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2e170 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2e180 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
2e190 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
2e1a0 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
2e1b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2e1c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e1d0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2e1e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2e1f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e200 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2e210 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2e220 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2e230 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
2e240 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
2e250 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2e260 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
2e270 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
2e280 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
2e290 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
2e2a0 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
2e2b0 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
2e2c0 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
2e2d0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
2e2e0 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
2e2f0 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
2e300 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
2e310 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
2e320 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
2e330 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2e340 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
2e350 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
2e360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2e370 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2e380 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
2e390 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
2e3a0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
2e3b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 69  .        rc = fi
2e3c0 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
2e3d0 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  , pCell, 0, info
2e3e0 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
2e3f0 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &sz);.        if
2e400 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2e420 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2e430 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2e440 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
2e450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e460 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
2e470 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
2e480 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
2e490 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
2e4a0 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
2e4b0 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
2e4c0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
2e4d0 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
2e4e0 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
2e4f0 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
2e500 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
2e510 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
2e520 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
2e530 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
2e540 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
2e550 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
2e560 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
2e570 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
2e580 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
2e590 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
2e5a0 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
2e5b0 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
2e5c0 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
2e5d0 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
2e5e0 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
2e5f0 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
2e600 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
2e610 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
2e620 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
2e630 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
2e640 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
2e650 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
2e660 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
2e670 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
2e680 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
2e690 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
2e6a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
2e6b0 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
2e6c0 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
2e6d0 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
2e6e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e6f0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
2e700 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
2e710 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
2e720 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
2e730 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
2e740 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
2e750 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
2e760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e770 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20  Space2 += sz;.  
2e780 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
2e790 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
2e7a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2e7b0 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70   iSpace2<=pBt->p
2e7c0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
2e7d0 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2e7e0 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2e7f0 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
2e800 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 4);.      if(
2e810 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e820 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2e830 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
2e840 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2e850 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2e860 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2e870 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2e880 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
2e890 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
2e8a0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a  , pNew->pgno);..
2e8b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
2e8c0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2e8d0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  um database, and
2e8e0 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61   not a leaf-data
2e8f0 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20   tree,.      ** 
2e900 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20  then update the 
2e910 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68  pointer map with
2e920 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
2e930 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  e overflow page.
2e940 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
2e950 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65  e cell just inse
2e960 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28  rted points to (
2e970 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
2e980 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
2e990 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65 61  TOVACUUM && !lea
2e9a0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
2e9b0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
2e9c0 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  vfl(pParent, nxD
2e9d0 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  iv);.        if(
2e9e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e9f0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2ea00 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2ea10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ea20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20    }.      j++;. 
2ea30 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
2ea40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
2ea50 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2ea60 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
2ea70 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
2ea80 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2ea90 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2eaa0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2eab0 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  pBt, pNew->pgno,
2eac0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2ead0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
2eae0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2eaf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2eb00 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2eb10 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
2eb20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
2eb30 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
2eb40 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
2eb50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
2eb60 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
2eb70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
2eb80 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
2eb90 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
2eba0 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
2ebb0 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
2ebc0 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
2ebd0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
2ebe0 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20  ld, 4);.    if( 
2ebf0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2ec00 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2ec10 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
2ec20 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d  te(zChild), PTRM
2ec30 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
2ec40 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a  nNew-1]->pgno);.
2ec50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ec60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ec70 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2ec80 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2ec90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2eca0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2ecb0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2ecc0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2ecd0 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70  ;.  if( nxDiv==p
2ece0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50  Parent->nCell+pP
2ecf0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2ed00 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74   ){.    /* Right
2ed10 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
2ed20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2ed30 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
2ed40 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2ed50 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2ed60 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2ed70 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b  set+8], pgnoNew[
2ed80 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73  nNew-1]);.  }els
2ed90 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d  e{.    /* Right-
2eda0 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20  most sibling is 
2edb0 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f  the left child o
2edc0 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  f the first entr
2edd0 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20  y in pParent.   
2ede0 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69 67   ** past the rig
2edf0 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20  ht-most divider 
2ee00 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74  entry */.    put
2ee10 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2ee20 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  owCell(pParent, 
2ee30 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b  nxDiv), pgnoNew[
2ee40 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20  nNew-1]);.  }.. 
2ee50 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
2ee60 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2ee70 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
2ee80 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
2ee90 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
2eea0 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
2eeb0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2eec0 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
2eed0 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
2eee0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
2eef0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2ef00 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
2ef10 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
2ef20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2ef30 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
2ef40 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
2ef50 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70  ee(apCell);.  ap
2ef60 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 54 52 41 43  Cell = 0;.  TRAC
2ef70 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
2ef80 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
2ef90 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
2efa0 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
2efb0 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
2efc0 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
2efd0 6c 6c 29 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ll));.  pPage->n
2efe0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
2eff0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2f000 65 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  e);.  pCur->iPag
2f010 65 2d 2d 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61  e--;.  rc = bala
2f020 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  nce(pCur, 0);.  
2f030 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
2f040 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
2f050 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
2f060 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
2f070 69 74 65 33 50 61 67 65 46 72 65 65 28 61 53 70  ite3PageFree(aSp
2f080 61 63 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  ace2);.  sqlite3
2f090 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
2f0a0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
2f0b0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
2f0c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
2f0d0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
2f0e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
2f0f0 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
2f100 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
2f110 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 70 50  .  }.  pCur->apP
2f120 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2f130 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
2f140 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2f150 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2f160 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
2f170 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
2f180 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e   of a btree when
2f190 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2f1a0 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
2f1b0 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e  lls.  This is an
2f1c0 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
2f1d0 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a  make the tree.**
2f1e0 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e   shallower by on
2f1f0 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  e level..*/.stat
2f200 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73  ic int balance_s
2f210 68 61 6c 6c 6f 77 65 72 28 42 74 43 75 72 73 6f  hallower(BtCurso
2f220 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2f230 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
2f240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
2f250 20 70 61 67 65 20 6f 66 20 42 2d 54 72 65 65 20   page of B-Tree 
2f260 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
2f270 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
2f280 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68    /* The only ch
2f290 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67  ild page of pPag
2f2a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2f2b0 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
2f2c0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2f2d0 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f  er for pChild */
2f2e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2f2f0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2f300 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
2f310 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
2f320 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  s */.  BtShared 
2f330 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
2f340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2f350 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75  in BTree structu
2f360 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65  re */.  int mxCe
2f370 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20  llPerPage;      
2f380 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2f390 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2f3a0 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  per page */.  u8
2f3b0 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20   **apCell;      
2f3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2f3d0 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67  l cells from pag
2f3e0 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
2f3f0 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
2f400 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2f410 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
2f420 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
2f430 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  /..  assert( pCu
2f440 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20  r->iPage==0 );. 
2f450 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2f460 70 50 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73 73  pPage[0];..  ass
2f470 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2f480 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2f490 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f4a0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2f4b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74  >mutex) );.  pBt
2f4c0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2f4d0 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d   mxCellPerPage =
2f4e0 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20   MX_CELL(pBt);. 
2f4f0 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
2f500 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50  3Malloc( mxCellP
2f510 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
2f520 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29  8*)+sizeof(u16))
2f530 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
2f540 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2f550 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
2f560 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
2f570 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
2f580 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
2f590 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
2f5a0 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
2f5b0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
2f5c0 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
2f5d0 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
2f5e0 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
2f5f0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
2f600 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
2f610 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
2f620 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
2f630 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
2f640 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2f650 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
2f660 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
2f670 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
2f680 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
2f690 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
2f6a0 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
2f6b0 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
2f6c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2f6d0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2f6e0 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
2f6f0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
2f700 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
2f710 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
2f720 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
2f730 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
2f740 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2f750 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
2f760 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
2f770 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
2f780 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
2f790 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
2f7a0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
2f7b0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
2f7c0 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
2f7d0 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
2f7e0 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
2f7f0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
2f800 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
2f810 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
2f820 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
2f830 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
2f840 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
2f850 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
2f860 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
2f870 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
2f880 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
2f890 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 56  ee..    */.    V
2f8a0 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70  VA_ONLY( pCur->p
2f8b0 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31  agesShuffled = 1
2f8c0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   );.    pgnoChil
2f8d0 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
2f8e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2f8f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2f900 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2f910 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20  oChild>0 );.    
2f920 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
2f930 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  d<=pagerPagecoun
2f940 74 28 70 50 61 67 65 2d 3e 70 42 74 29 20 29 3b  t(pPage->pBt) );
2f950 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f960 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50  3BtreeGetPage(pP
2f970 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68  age->pBt, pgnoCh
2f980 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29  ild, &pChild, 0)
2f990 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2f9a0 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
2f9b0 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28  balance;.    if(
2f9c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
2f9d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2f9e0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2f9f0 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
2fa00 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2fa10 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2fa20 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
2fa30 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
2fa40 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
2fa50 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
2fa60 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
2fa70 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
2fa80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
2fa90 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
2faa0 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
2fab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
2fac0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2fad0 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
2fae0 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
2faf0 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
2fb00 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2fb10 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
2fb20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2fb30 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
2fb40 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
2fb50 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
2fb60 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2fb70 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
2fb80 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
2fb90 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
2fba0 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2fbb0 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
2fbc0 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
2fbd0 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
2fbe0 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
2fbf0 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
2fc00 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
2fc10 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2fc20 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2fc30 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2fc40 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
2fc50 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2fc60 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2fc70 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20  rOffset+8], .   
2fc80 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
2fc90 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e(&pChild->aData
2fca0 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73  [pChild->hdrOffs
2fcb0 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20  et+8]));.       
2fcc0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2fcd0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
2fce0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2fcf0 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
2fd00 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
2fd10 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2fd20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2fd30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
2fd40 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
2fd50 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
2fd60 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
2fd70 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
2fd80 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
2fd90 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
2fda0 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
2fdb0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2fdc0 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
2fdd0 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
2fde0 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
2fdf0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
2fe00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fe10 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
2fe20 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
2fe30 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
2fe40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
2fe50 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
2fe60 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  it = 0;.      rc
2fe70 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2fe80 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
2fe90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2fea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2feb0 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43       freePage(pC
2fec0 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41  hild);.      TRA
2fed0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72  CE(("BALANCE: tr
2fee0 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64 20  ansfer child %d 
2fef0 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c  into root %d\n",
2ff00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2ff10 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61  Child->pgno, pPa
2ff20 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
2ff30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
2ff40 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
2ff50 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
2ff60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2ff70 55 55 4d 0a 20 20 20 20 69 66 28 20 49 53 41 55  UUM.    if( ISAU
2ff80 54 4f 56 41 43 55 55 4d 20 26 26 20 72 63 3d 3d  TOVACUUM && rc==
2ff90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ffa0 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
2ffb0 50 74 72 6d 61 70 73 28 70 50 61 67 65 29 3b 0a  Ptrmaps(pPage);.
2ffc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2ffd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
2ffe0 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68  ild);.  }.end_sh
2fff0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20  allow_balance:. 
30000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70   sqlite3_free(ap
30010 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
30020 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
30030 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f  e root page is o
30040 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68  verfull.**.** Wh
30050 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  en this happens,
30060 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68   Create a new ch
30070 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70  ild page and cop
30080 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  y the.** content
30090 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e  s of the root in
300a0 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54  to the child.  T
300b0 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f  hen make the roo
300c0 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70  t.** page an emp
300d0 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67  ty page with rig
300e0 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67  htChild pointing
300f0 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63   to the new.** c
30100 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c  hild.   Finally,
30110 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e   call balance_in
30120 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20  ternal() on the 
30130 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20  new child.** to 
30140 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69  cause it to spli
30150 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
30160 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
30170 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
30180 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
30190 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
301a0 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
301b0 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
301c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
301d0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
301e0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 2a   the root page *
301f0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
30200 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ild;    /* Point
30210 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
30220 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
30230 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
30240 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
30250 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  f the new child 
30260 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  page */.  BtShar
30270 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
30280 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
30290 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
302a0 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
302b0 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61  usable size of a
302c0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64   page */.  u8 *d
302d0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
302e0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
302f0 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a   parent page */.
30300 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20    u8 *cdata;    
30310 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
30320 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
30330 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ge */.  int hdr;
30340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30350 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68 65  ffset to page he
30360 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a  ader in parent *
30370 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
30380 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
30390 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t to content of 
303a0 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61  first cell in pa
303b0 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rent */..  asser
303c0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  t( pCur->iPage==
303d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
303e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
303f0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a  nOverflow>0 );..
30400 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
30410 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
30420 3d 20 31 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  = 1 );.  pPage =
30430 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
30440 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
30450 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
30460 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
30470 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
30480 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
30490 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
304a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
304b0 67 65 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c  ge) );.  rc = al
304c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
304d0 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70  pBt, &pChild, &p
304e0 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d  gnoChild, pPage-
304f0 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28  >pgno, 0);.  if(
30500 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30510 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30520 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
30530 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
30540 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ge) );.  usableS
30550 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
30560 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20  eSize;.  data = 
30570 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
30580 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
30590 4f 66 66 73 65 74 3b 0a 20 20 63 62 72 6b 20 3d  Offset;.  cbrk =
305a0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
305b0 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61  hdr+5]);.  cdata
305c0 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61   = pChild->aData
305d0 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61  ;.  memcpy(cdata
305e0 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50  , &data[hdr], pP
305f0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  age->cellOffset+
30600 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68  2*pPage->nCell-h
30610 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63  dr);.  memcpy(&c
30620 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74  data[cbrk], &dat
30630 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  a[cbrk], usableS
30640 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a 20 20 61 73  ize-cbrk);..  as
30650 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73  sert( pChild->is
30660 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20  Init==0 );.  rc 
30670 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
30680 69 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  itPage(pChild);.
30690 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
306a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
306b0 43 6f 70 79 20 3d 20 70 50 61 67 65 2d 3e 6e 4f  Copy = pPage->nO
306c0 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
306d0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 3b  Page->aOvfl[0]);
306e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 68 69  .    memcpy(pChi
306f0 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
30700 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f 70 79 29 3b  ->aOvfl, nCopy);
30710 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  .    pChild->nOv
30720 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e  erflow = pPage->
30730 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
30740 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  f( pChild->nOver
30750 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 43  flow ){.      pC
30760 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  hild->nFree = 0;
30770 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
30780 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
30790 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
307a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
307b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
307c0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
307d0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72  Page) );.    zer
307e0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
307f0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
30800 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  ~PTF_LEAF);.    
30810 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
30820 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
30830 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
30840 43 68 69 6c 64 29 3b 0a 20 20 20 20 54 52 41 43  Child);.    TRAC
30850 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70  E(("BALANCE: cop
30860 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25  y root %d into %
30870 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
30880 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  o, pChild->pgno)
30890 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  );.    if( ISAUT
308a0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
308b0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
308c0 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  pBt, pChild->pgn
308d0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
308e0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23   pPage->pgno);.#
308f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30900 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30910 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30930 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
30940 72 6d 61 70 73 28 70 43 68 69 6c 64 29 3b 0a 20  rmaps(pChild);. 
30950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
30960 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
30970 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
30980 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 0;.      }.#e
30990 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
309a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
309b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
309c0 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 20 20 70 43  >iPage++;.    pC
309d0 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 20 3d 20  ur->apPage[1] = 
309e0 70 43 68 69 6c 64 3b 0a 20 20 20 20 70 43 75 72  pChild;.    pCur
309f0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
30a00 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
30a10 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a  _nonroot(pCur);.
30a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
30a30 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
30a40 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
30a50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
30a60 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20   page that pCur 
30a70 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
30a80 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65   to has just bee
30a90 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a  n modified in.**
30aa0 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20   some way. This 
30ab0 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73  function figures
30ac0 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64   out if this mod
30ad0 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20  ification means 
30ae0 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64  the.** tree need
30af0 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
30b00 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c  , and if so call
30b10 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  s the appropriat
30b20 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20  e balancing .** 
30b30 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
30b40 50 61 72 61 6d 65 74 65 72 20 69 73 49 6e 73 65  Parameter isInse
30b50 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 20  rt is true if a 
30b60 6e 65 77 20 63 65 6c 6c 20 77 61 73 20 6a 75 73  new cell was jus
30b70 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  t inserted into 
30b80 74 68 65 0a 2a 2a 20 70 61 67 65 2c 20 6f 72 20  the.** page, or 
30b90 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
30ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
30bb0 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20  alance(BtCursor 
30bc0 2a 70 43 75 72 2c 20 69 6e 74 20 69 73 49 6e 73  *pCur, int isIns
30bd0 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ert){.  int rc =
30be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
30bf0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
30c00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
30c10 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20 20 61 73 73  ->iPage];..  ass
30c20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
30c30 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
30c40 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
30c50 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
30c60 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
30c70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30c80 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
30c90 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
30ca0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
30cb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
30cc0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
30cd0 6e 63 65 5f 64 65 65 70 65 72 28 70 43 75 72 29  nce_deeper(pCur)
30ce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30cf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d  pCur->apPage[0]=
30d00 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =pPage );.      
30d10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
30d20 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72  Overflow==0 || r
30d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
30d40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
30d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
30d60 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
30d70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
30d80 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70  ance_shallower(p
30d90 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Cur);.      asse
30da0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
30db0 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20  [0]==pPage );.  
30dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30dd0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
30de0 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
30df0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
30e00 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
30e10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
30e20 20 0a 20 20 20 20 20 20 20 20 28 21 69 73 49 6e   .        (!isIn
30e30 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e  sert && pPage->n
30e40 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d  Free>pPage->pBt-
30e50 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
30e60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
30e70 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
30e80 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
30e90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30ea0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
30eb0 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
30ec0 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
30ed0 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
30ee0 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
30ef0 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
30f00 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
30f10 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
30f20 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
30f30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
30f40 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
30f50 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
30f60 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
30f70 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
30f80 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
30f90 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
30fa0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
30fb0 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
30fc0 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
30fd0 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
30fe0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
30ff0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
31000 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c  ED..**.** As wel
31010 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69 74  l as cursors wit
31020 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72  h wrFlag==0, cur
31030 73 6f 72 73 20 77 69 74 68 20 0a 2a 2a 20 69 73  sors with .** is
31040 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d  IncrblobHandle==
31050 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69  1 are also consi
31060 64 65 72 65 64 20 27 72 65 61 64 27 20 63 75 72  dered 'read' cur
31070 73 6f 72 73 20 62 65 63 61 75 73 65 0a 2a 2a 20  sors because.** 
31080 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
31090 20 63 75 72 73 6f 72 73 20 61 72 65 20 75 73 65   cursors are use
310a0 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  d for both readi
310b0 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a  ng and writing..
310c0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52  **.** When pgnoR
310d0 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20  oot is the root 
310e0 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65  page of an intke
310f0 79 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66 75  y table, this fu
31100 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a  nction is also.*
31110 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  * responsible fo
31120 72 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 69  r invalidating i
31130 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
31140 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68 65  cursors when the
31150 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e   table row.** on
31160 20 77 68 69 63 68 20 74 68 65 79 20 61 72 65 20   which they are 
31170 6f 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74 65  opened is delete
31180 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20 43  d or modified. C
31190 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
311a0 69 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  idated.** accord
311b0 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ing to the follo
311c0 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  wing rules:.**.*
311d0 2a 20 20 20 31 29 20 57 68 65 6e 20 42 74 72 65  *   1) When Btre
311e0 65 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69 73  eClearTable() is
311f0 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
31200 65 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68 65  etely delete the
31210 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20   contents.**    
31220 20 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74 61    of a B-Tree ta
31230 62 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69 73  ble, pExclude is
31240 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64   set to zero and
31250 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20   parameter iRow 
31260 69 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74 20  is .**      set 
31270 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  to non-zero. In 
31280 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69 6e  this case all in
31290 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
312a0 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20  ursors open.**  
312b0 20 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65      on the table
312c0 20 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f 52   rooted at pgnoR
312d0 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64 61  oot are invalida
312e0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  ted..**.**   2) 
312f0 57 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72 74  When BtreeInsert
31300 28 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65 28  (), BtreeDelete(
31310 29 20 6f 72 20 42 74 72 65 65 50 75 74 44 61 74  ) or BtreePutDat
31320 61 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  a() is called to
31330 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66 79   .**      modify
31340 20 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69 61   a table row via
31350 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
31360 74 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73  t, pExclude is s
31370 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20  et to the .**   
31380 20 20 20 77 72 69 74 65 20 63 75 72 73 6f 72 20     write cursor 
31390 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20 6d  used to do the m
313a0 6f 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20  odification and 
313b0 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69  parameter iRow i
313c0 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f  s set.**      to
313d0 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f 77   the integer row
313e0 20 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72 65   id of the B-Tre
313f0 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f  e entry being mo
31400 64 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a  dified. Unless.*
31410 2a 20 20 20 20 20 20 70 45 78 63 6c 75 64 65 20  *      pExclude 
31420 69 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e 63  is itself an inc
31430 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
31440 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69  rsor, then all i
31450 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20  ncremental.**   
31460 20 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20     blob cursors 
31470 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77  open on row iRow
31480 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61   of the B-Tree a
31490 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  re invalidated..
314a0 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62 6f  **.**   3) If bo
314b0 74 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64 20  th pExclude and 
314c0 69 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f 20  iRow are set to 
314d0 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65  zero, no increme
314e0 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20  ntal blob .**   
314f0 20 20 20 63 75 72 73 6f 72 73 20 61 72 65 20 69     cursors are i
31500 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
31510 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46  tatic int checkF
31520 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  orReadConflicts(
31530 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
31540 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
31550 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31560 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67  to check */.  Pg
31570 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20  no pgnoRoot,    
31580 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f        /* Look fo
31590 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  r read cursors o
315a0 6e 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  n this btree */.
315b0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63    BtCursor *pExc
315c0 6c 75 64 65 2c 20 20 20 20 20 2f 2a 20 49 67 6e  lude,     /* Ign
315d0 6f 72 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ore this cursor 
315e0 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 20 20 20  */.  i64 iRow   
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31600 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
31610 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
31620 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
31630 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
31640 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
31650 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
31660 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b  db = pBtree->db;
31670 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31680 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
31690 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66  x(pBtree) );.  f
316a0 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
316b0 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
316c0 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45  ){.    if( p==pE
316d0 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75  xclude ) continu
316e0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67  e;.    if( p->pg
316f0 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74  noRoot!=pgnoRoot
31700 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
31710 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31720 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66  _INCRBLOB.    if
31730 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
31740 61 6e 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20  andle && ( .    
31750 20 20 20 20 20 28 21 70 45 78 63 6c 75 64 65 20       (!pExclude 
31760 26 26 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c  && iRow).      |
31770 7c 20 28 70 45 78 63 6c 75 64 65 20 26 26 20 21  | (pExclude && !
31780 70 45 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72  pExclude->isIncr
31790 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d  blobHandle && p-
317a0 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
317b0 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20  ).    )){.      
317c0 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
317d0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
317e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
317f0 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53   p->eState!=CURS
31800 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69  OR_VALID ) conti
31810 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
31820 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64  wrFlag==0 .#ifnd
31830 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
31840 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20  NCRBLOB.     || 
31850 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
31860 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  dle.#endif.    )
31870 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
31880 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42  *dbOther = p->pB
31890 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
318a0 61 73 73 65 72 74 28 64 62 4f 74 68 65 72 29 3b  assert(dbOther);
318b0 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68  .      if( dbOth
318c0 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68  er!=db && (dbOth
318d0 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  er->flags & SQLI
318e0 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
318f0 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed)==0 ){.      
31900 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
31910 69 6f 6e 42 6c 6f 63 6b 65 64 28 64 62 2c 20 64  ionBlocked(db, d
31920 62 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 20  bOther);.       
31930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
31940 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
31950 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
31960 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
31970 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
31980 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
31990 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42  ecord into the B
319a0 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69  Tree.  The key i
319b0 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79  s given by (pKey
319c0 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68  ,nKey).** and th
319d0 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20  e data is given 
319e0 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29  by (pData,nData)
319f0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  .  The cursor is
31a00 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a   used only to.**
31a10 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62   define what tab
31a20 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68  le the record sh
31a30 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
31a40 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73   into.  The curs
31a50 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
31a60 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
31a70 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  om location..**.
31a80 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59  ** For an INTKEY
31a90 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65   table, only the
31aa0 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74   nKey value of t
31ab0 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20  he key is used. 
31ac0 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f   pKey is.** igno
31ad0 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f  red.  For a ZERO
31ae0 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20  DATA table, the 
31af0 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20  pData and nData 
31b00 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64  are both ignored
31b10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
31b20 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
31b30 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
31b40 20 74 68 65 6e 20 61 20 73 75 63 63 65 73 73 66   then a successf
31b50 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71  ul call to.** sq
31b60 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
31b70 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f  () to seek curso
31b80 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c  r pCur to (pKey,
31b90 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61   nKey) has alrea
31ba0 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f  dy.** been perfo
31bb0 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74  rmed. seekResult
31bc0 20 69 73 20 74 68 65 20 73 65 61 72 63 68 20 72   is the search r
31bd0 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28  esult returned (
31be0 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75  a negative.** nu
31bf0 6d 62 65 72 20 69 66 20 70 43 75 72 20 70 6f 69  mber if pCur poi
31c00 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20  nts at an entry 
31c10 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  that is smaller 
31c20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79  than (pKey, nKey
31c30 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74  ), or.** a posit
31c40 69 76 65 20 76 61 6c 75 65 20 69 66 20 70 43 75  ive value if pCu
31c50 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65  r points at an e
31c60 74 72 79 20 74 68 61 74 20 69 73 20 6c 61 72 67  try that is larg
31c70 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65  er than .** (pKe
31c80 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a  y, nKey)). .**.*
31c90 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
31ca0 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
31cb0 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20   0, then cursor 
31cc0 70 43 75 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  pCur may point t
31cd0 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74 72 79 20  o any .** entry 
31ce0 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61  or to no entry a
31cf0 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63  t all. In this c
31d00 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
31d10 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a  n has to seek.**
31d20 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f   the cursor befo
31d30 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63  re the new key c
31d40 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  an be inserted..
31d50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
31d60 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
31d70 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
31d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31d90 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
31da0 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
31db0 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
31dc0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
31dd0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
31de0 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
31df0 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
31e00 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
31e10 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
31e20 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
31e30 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
31e40 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
31e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
31e70 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
31e80 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
31e90 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
31ea0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31eb0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
31ec0 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
31ed0 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65  pend */.  int se
31ee0 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  ekResult        
31ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
31f00 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 71 6c 69  lt of prior sqli
31f10 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29  te3BtreeMoveto()
31f20 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   call */.){.  in
31f30 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20  t rc;.  int loc 
31f40 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20  = seekResult;.  
31f50 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74  int szNew;.  int
31f60 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
31f70 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20  *pPage;.  Btree 
31f80 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
31f90 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
31fa0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
31fb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c  nsigned char *ol
31fc0 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  dCell;.  unsigne
31fd0 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20  d char *newCell 
31fe0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
31ff0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
32000 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
32010 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
32020 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
32030 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
32040 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
32050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
32060 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 72  r->wrFlag );.  r
32070 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64  c = checkForRead
32080 43 6f 6e 66 6c 69 63 74 73 28 70 43 75 72 2d 3e  Conflicts(pCur->
32090 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
320a0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b  noRoot, pCur, nK
320b0 65 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ey);.  if( rc ){
320c0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
320d0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70    /* The table p
320e0 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
320f0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
32100 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
32110 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  =SQLITE_LOCKED_S
32120 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20  HAREDCACHE );.  
32130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
32140 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
32150 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
32160 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
32170 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
32180 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
32190 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
321a0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
321b0 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
321c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73  ..  **.  ** In s
321d0 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 63  ome cases, the c
321e0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
321f0 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f  reeMoveto() belo
32200 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f  w is a no-op. Fo
32210 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  r.  ** example, 
32220 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
32230 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
32240 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72   with auto-gener
32250 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a  ated integer.  *
32260 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45  * keys, the VDBE
32270 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73   layer invokes s
32280 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
32290 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
322a0 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65  the .  ** intege
322b0 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74  r key to use. It
322c0 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73   then calls this
322d0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74   function to act
322e0 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65  ually insert the
322f0 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f   .  ** data into
32300 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72   the intkey B-Tr
32310 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
32320 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
32330 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73  eto() recognizes
32340 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63  .  ** that the c
32350 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
32360 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20   where it needs 
32370 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e  to be and return
32380 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64  s without.  ** d
32390 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54  oing any work. T
323a0 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e  o avoid thwartin
323b0 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  g these optimiza
323c0 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70  tions, it is imp
323d0 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20  ortant.  ** not 
323e0 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72  to clear the cur
323f0 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  sor here..  */. 
32400 20 69 66 28 0a 20 20 20 20 53 51 4c 49 54 45 5f   if(.    SQLITE_
32410 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
32420 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
32430 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
32440 75 72 29 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26  ur)) || (!loc &&
32450 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
32460 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
32470 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
32480 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e  Key, nKey, appen
32490 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20  dBias, &loc)).  
324a0 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  )){.    return r
324b0 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20  c;.  }..  pPage 
324c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
324d0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
324e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
324f0 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
32500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
32510 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
32520 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
32530 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
32540 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
32550 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
32560 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
32570 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
32580 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
32590 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
325a0 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
325b0 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
325c0 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
325d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
325e0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f  isInit );.  allo
325f0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
32600 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20  t);.  newCell = 
32610 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
32620 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30    if( newCell==0
32630 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
32640 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66  _NOMEM;.  rc = f
32650 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c  illInCell(pPage,
32660 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20   newCell, pKey, 
32670 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61  nKey, pData, nDa
32680 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65  ta, nZero, &szNe
32690 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  w);.  if( rc ) g
326a0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
326b0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d    assert( szNew=
326c0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
326d0 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a  ge, newCell) );.
326e0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c    assert( szNew<
326f0 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42  =MX_CELL_SIZE(pB
32700 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43  t) );.  idx = pC
32710 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
32720 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f  iPage];.  if( lo
32730 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56  c==0 && CURSOR_V
32740 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
32750 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  te ){.    u16 sz
32760 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
32770 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
32780 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  l );.    rc = sq
32790 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
327a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
327b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
327c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
327d0 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sert;.    }.    
327e0 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65  oldCell = findCe
327f0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  ll(pPage, idx);.
32800 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
32810 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65  leaf ){.      me
32820 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c  mcpy(newCell, ol
32830 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d  dCell, 4);.    }
32840 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c  .    szOld = cel
32850 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
32860 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63  oldCell);.    rc
32870 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
32880 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
32890 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
328a0 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
328b0 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
328c0 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29  age, idx, szOld)
328d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
328e0 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
328f0 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
32900 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
32910 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
32920 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
32930 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32940 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69  e->leaf );.    i
32950 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
32960 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
32970 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
32980 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
32990 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
329a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
329b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
329c0 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
329d0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
329e0 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c  age, idx, newCel
329f0 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
32a00 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
32a10 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
32a20 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50  e->nCell>0 || pP
32a30 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
32a40 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20   );..  /* If no 
32a50 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
32a60 64 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28  d, call balance(
32a70 29 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61  ) to deal with a
32a80 6e 79 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 0a  ny overflow and.
32a90 20 20 2a 2a 20 6d 6f 76 65 20 74 68 65 20 63 75    ** move the cu
32aa0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  rsor to point at
32ab0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
32ac0 20 74 61 62 6c 65 20 28 73 69 6e 63 65 20 62 61   table (since ba
32ad0 6c 61 6e 63 65 20 6d 61 79 0a 20 20 2a 2a 20 68  lance may.  ** h
32ae0 61 76 65 20 72 65 61 72 72 61 6e 67 65 64 20 74  ave rearranged t
32af0 68 65 20 74 61 62 6c 65 20 69 6e 20 73 75 63 68  he table in such
32b00 20 61 20 77 61 79 20 61 73 20 74 6f 20 69 6e 76   a way as to inv
32b10 61 6c 69 64 61 74 65 20 42 74 43 75 72 73 6f 72  alidate BtCursor
32b20 2e 61 70 50 61 67 65 5b 5d 0a 20 20 2a 2a 20 6f  .apPage[].  ** o
32b30 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
32b40 5b 5d 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  [])..  **.  ** E
32b50 78 63 65 70 74 2c 20 69 66 20 61 6c 6c 20 6f 66  xcept, if all of
32b60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
32b70 72 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 68  re true, do noth
32b80 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
32b90 20 2a 20 49 6e 73 65 72 74 69 6e 67 20 74 68 65   * Inserting the
32ba0 20 6e 65 77 20 63 65 6c 6c 20 64 69 64 20 6e 6f   new cell did no
32bb0 74 20 63 61 75 73 65 20 6f 76 65 72 66 6c 6f 77  t cause overflow
32bc0 2c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ,.  **.  **   * 
32bd0 42 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67  Before inserting
32be0 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 74 68   the new cell th
32bf0 65 20 63 75 72 73 6f 72 20 77 61 73 20 70 6f 69  e cursor was poi
32c00 6e 74 69 6e 67 20 61 74 20 74 68 65 20 0a 20 20  nting at the .  
32c10 2a 2a 20 20 20 20 20 6c 61 72 67 65 73 74 20 6b  **     largest k
32c20 65 79 20 69 6e 20 61 6e 20 69 6e 74 6b 65 79 20  ey in an intkey 
32c30 42 2d 54 72 65 65 2c 20 61 6e 64 0a 20 20 2a 2a  B-Tree, and.  **
32c40 0a 20 20 2a 2a 20 20 20 2a 20 54 68 65 20 6b 65  .  **   * The ke
32c50 79 20 76 61 6c 75 65 20 61 73 73 6f 63 69 61 74  y value associat
32c60 65 64 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ed with the new 
32c70 63 65 6c 6c 20 69 73 20 6e 6f 77 20 74 68 65 20  cell is now the 
32c80 6c 61 72 67 65 73 74 20 0a 20 20 2a 2a 20 20 20  largest .  **   
32c90 20 20 69 6e 20 74 68 65 20 42 2d 54 72 65 65 2e    in the B-Tree.
32ca0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68  .  **.  ** In th
32cb0 69 73 20 63 61 73 65 20 74 68 65 20 63 75 72 73  is case the curs
32cc0 6f 72 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  or can be safely
32cd0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
32ce0 74 20 74 68 65 20 28 6e 65 77 29 20 0a 20 20 2a  t the (new) .  *
32cf0 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  * largest key va
32d00 6c 75 65 20 69 6e 20 74 68 65 20 42 2d 54 72 65  lue in the B-Tre
32d10 65 2e 20 44 6f 69 6e 67 20 73 6f 20 73 70 65 65  e. Doing so spee
32d20 64 73 20 75 70 20 69 6e 73 65 72 74 69 6e 67 20  ds up inserting 
32d30 61 20 73 65 74 0a 20 20 2a 2a 20 6f 66 20 65 6e  a set.  ** of en
32d40 74 72 69 65 73 20 77 69 74 68 20 69 6e 63 72 65  tries with incre
32d50 61 73 69 6e 67 20 69 6e 74 65 67 65 72 20 6b 65  asing integer ke
32d60 79 20 76 61 6c 75 65 73 20 76 69 61 20 61 20 73  y values via a s
32d70 69 6e 67 6c 65 20 63 75 72 73 6f 72 0a 20 20 2a  ingle cursor.  *
32d80 2a 20 28 63 6f 6d 65 73 20 75 70 20 77 69 74 68  * (comes up with
32d90 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e   "INSERT INTO ..
32da0 2e 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  . SELECT ..." st
32db0 61 74 65 6d 65 6e 74 73 29 2c 20 61 73 20 0a 20  atements), as . 
32dc0 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 69 6e 73   ** the next ins
32dd0 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  ert operation is
32de0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
32df0 20 73 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72   seek the cursor
32e00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
32e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26  =SQLITE_OK .   &
32e20 26 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  & (pPage->nOverf
32e30 6c 6f 77 20 7c 7c 20 21 70 43 75 72 2d 3e 61 74  low || !pCur->at
32e40 4c 61 73 74 20 7c 7c 20 6c 6f 63 3e 3d 30 20 7c  Last || loc>=0 |
32e50 7c 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  | !pCur->apPage[
32e60 30 5d 2d 3e 69 6e 74 4b 65 79 29 0a 20 20 29 7b  0]->intKey).  ){
32e70 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
32e80 65 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 20 20  e(pCur, 1);.    
32e90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32ea0 4b 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54  K ){.      moveT
32eb0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 20  oRoot(pCur);.   
32ec0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4d   }.  }.  .  /* M
32ed0 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f  ust make sure nO
32ee0 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74  verflow is reset
32ef0 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66   to zero even if
32f00 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20   the balance(). 
32f10 20 2a 2a 20 66 61 69 6c 73 2e 20 20 49 6e 74 65   ** fails.  Inte
32f20 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
32f30 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ure corruption w
32f40 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72  ill result other
32f50 77 69 73 65 2e 20 2a 2f 0a 20 20 70 43 75 72 2d  wise. */.  pCur-
32f60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
32f70 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  age]->nOverflow 
32f80 3d 20 30 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74  = 0;..end_insert
32f90 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
32fa0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
32fb0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
32fc0 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
32fd0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75  ting to.  The cu
32fe0 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
32ff0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72  pointing at a ar
33000 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e  bitrary location
33010 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33020 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
33030 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
33040 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
33050 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
33060 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e 74  r->iPage];.  int
33070 20 69 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64   idx;.  unsigned
33080 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
33090 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
330a0 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  gnoChild = 0;.  
330b0 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
330c0 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
330d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
330e0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
330f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
33100 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
33110 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
33120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
33130 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
33140 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
33150 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
33160 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
33170 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
33180 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
33190 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
331a0 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28  >skip;.  }.  if(
331b0 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49   NEVER(pCur->aiI
331c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
331d0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 20 29  =pPage->nCell) )
331e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
331f0 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54  ITE_ERROR;  /* T
33200 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
33210 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79   pointing to any
33220 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 61  thing */.  }.  a
33230 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
33240 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63 68  lag );.  rc = ch
33250 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69  eckForReadConfli
33260 63 74 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  cts(p, pCur->pgn
33270 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75  oRoot, pCur, pCu
33280 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20  r->info.nKey);. 
33290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
332a0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
332b0 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e   table pCur poin
332c0 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64  ts to has a read
332d0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61 73 73   lock */.    ass
332e0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
332f0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
33300 48 45 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  HE );.    return
33310 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   rc;.  }..  /* R
33320 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
33330 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
33340 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74  on (a no-op if t
33350 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
33360 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52   in .  ** CURSOR
33370 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
33380 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65  te) and save the
33390 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
333a0 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
333b0 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68  .  ** open on th
333c0 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68  e same table. Th
333d0 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  en call sqlite3P
333e0 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
333f0 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61  he page.  ** tha
33400 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c  t the entry will
33410 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
33420 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
33430 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43    (rc = restoreC
33440 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
33450 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
33460 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
33470 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
33480 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21  gnoRoot, pCur))!
33490 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20  =0 ||.    (rc = 
334a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
334b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
334c0 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  ))!=0.  ){.    r
334d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
334e0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
334f0 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70  ell within its p
33500 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
33510 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
33520 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
33530 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
33540 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
33550 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
33560 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
33570 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
33580 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
33590 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
335a0 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  /.  idx = pCur->
335b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
335c0 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  e];.  pCell = fi
335d0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
335e0 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  x);.  if( !pPage
335f0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
33600 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
33610 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20  te(pCell);.  }. 
33620 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
33630 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
33640 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
33650 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
33660 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
33670 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  f ){.    /*.    
33680 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20  ** The entry we 
33690 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c  are about to del
336a0 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  ete is not a lea
336b0 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f  f so if we do no
336c0 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65  t.    ** do some
336d0 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65  thing we will le
336e0 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e  ave a hole on an
336f0 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a   internal page..
33700 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74      ** We have t
33710 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20  o fill the hole 
33720 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63  by moving in a c
33730 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e  ell from a leaf.
33740 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78    The.    ** nex
33750 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65  t Cell after the
33760 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74   one to be delet
33770 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ed is guaranteed
33780 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20   to exist and.  
33790 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61    ** to be a lea
337a0 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20  f so we can use 
337b0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42  it..    */.    B
337c0 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b  tCursor leafCur;
337d0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c  .    MemPage *pL
337e0 65 61 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  eafPage = 0;..  
337f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
33800 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20  *pNext;.    int 
33810 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73  notUsed;.    uns
33820 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
33830 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  Cell = 0;.    as
33840 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 69 6e  sert( !pPage->in
33850 74 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69  tKey );.    sqli
33860 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
33870 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61  ursor(pCur, &lea
33880 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  fCur);.    rc = 
33890 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
338a0 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
338b0 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
338c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
338d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
338e0 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43  fCur.aiIdx[leafC
338f0 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a  ur.iPage]==0 );.
33900 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20        pLeafPage 
33910 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  = leafCur.apPage
33920 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b  [leafCur.iPage];
33930 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
33940 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
33950 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65  eafPage->pDbPage
33960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
33970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33980 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 61 66  {.      int leaf
33990 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20  CursorInvalid = 
339a0 30 3b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e  0;.      u16 szN
339b0 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ext;.      TRACE
339c0 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
339d0 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72  =%d delete inter
339e0 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c  nal from %d repl
339f0 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ace from leaf %d
33a00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43  \n",.         pC
33a10 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
33a20 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66  age->pgno, pLeaf
33a30 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
33a40 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
33a50 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ge, idx, cellSiz
33a60 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
33a70 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  l));.      pNext
33a80 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61   = findCell(pLea
33a90 66 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  fPage, 0);.     
33aa0 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69   szNext = cellSi
33ab0 7a 65 50 74 72 28 70 4c 65 61 66 50 61 67 65 2c  zePtr(pLeafPage,
33ac0 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
33ad0 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
33ae0 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
33af0 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  +4 );.      allo
33b00 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
33b10 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65  t);.      tempCe
33b20 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
33b30 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ace;.      if( t
33b40 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
33b50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
33b60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
33b70 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
33b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33b90 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43      rc = insertC
33ba0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
33bb0 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b  pNext-4, szNext+
33bc0 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b  4, tempCell, 0);
33bd0 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
33be0 20 2f 2a 20 54 68 65 20 22 69 66 22 20 73 74 61   /* The "if" sta
33bf0 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e 65  tement in the ne
33c00 78 74 20 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73  xt code block is
33c10 20 63 72 69 74 69 63 61 6c 2e 20 20 54 68 65 0a   critical.  The.
33c20 20 20 20 20 20 20 2a 2a 20 73 6c 69 67 68 74 65        ** slighte
33c30 73 74 20 65 72 72 6f 72 20 69 6e 20 74 68 61 74  st error in that
33c40 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64   statement would
33c50 20 61 6c 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f   allow SQLite to
33c60 20 6f 70 65 72 61 74 65 0a 20 20 20 20 20 20 2a   operate.      *
33c70 2a 20 63 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74  * correctly most
33c80 20 6f 66 20 74 68 65 20 74 69 6d 65 20 62 75 74   of the time but
33c90 20 70 72 6f 64 75 63 65 20 76 65 72 79 20 72 61   produce very ra
33ca0 72 65 20 66 61 69 6c 75 72 65 73 2e 20 20 54 6f  re failures.  To
33cb0 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72 64 20  .      ** guard 
33cc0 61 67 61 69 6e 73 74 20 74 68 69 73 2c 20 74 68  against this, th
33cd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
33ce0 6f 73 20 68 65 6c 70 20 74 6f 20 76 65 72 69 66  os help to verif
33cf0 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  y that.      ** 
33d00 74 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65  the "if" stateme
33d10 6e 74 20 69 73 20 77 65 6c 6c 20 74 65 73 74 65  nt is well teste
33d20 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
33d30 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
33d40 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
33d50 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
33d60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
33d70 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20 20  2/3 .           
33d80 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
33d90 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
33da0 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
33db0 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
33dc0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
33dd0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
33de0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  && pPage->nFree=
33df0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
33e00 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20 20 20  *2/3 .          
33e10 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
33e20 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
33e30 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
33e40 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
33e50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
33e60 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
33e70 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
33e80 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ==pBt->usableSiz
33e90 65 2a 32 2f 33 2b 31 20 0a 20 20 20 20 20 20 20  e*2/3+1 .       
33ea0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
33eb0 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
33ec0 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
33ed0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
33ee0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
33ef0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
33f00 3e 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  >0 && pPage->nFr
33f10 65 65 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ee<=pBt->usableS
33f20 69 7a 65 2a 32 2f 33 0a 20 20 20 20 20 20 20 20  ize*2/3.        
33f30 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61           && pLea
33f40 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
33f50 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
33f60 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20  bleSize*2/3 );. 
33f70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
33f80 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
33f90 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46  >0 || (pPage->nF
33fa0 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ree > pBt->usabl
33fb0 65 53 69 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20  eSize*2/3)).    
33fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
33fd0 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
33fe0 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74  +2+szNext == pBt
33ff0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
34000 20 29 3b 0a 0a 0a 20 20 20 20 20 20 69 66 28 20   );...      if( 
34010 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  (pPage->nOverflo
34020 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e  w>0 || (pPage->n
34030 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73 61 62  Free > pBt->usab
34040 6c 65 53 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a  leSize*2/3)) &&.
34050 20 20 20 20 20 20 20 20 20 20 28 70 4c 65 61 66            (pLeaf
34060 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
34070 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62  Next > pBt->usab
34080 6c 65 53 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20  leSize*2/3).    
34090 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
340a0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
340b0 61 6b 65 6e 20 69 66 20 74 68 65 20 69 6e 74 65  aken if the inte
340c0 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77  rnal node is now
340d0 20 65 69 74 68 65 72 20 6f 76 65 72 66 6c 6f 77   either overflow
340e0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ing.        ** o
340f0 72 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20  r underfull and 
34100 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 77 69  the leaf node wi
34110 6c 6c 20 62 65 20 75 6e 64 65 72 66 75 6c 6c 20  ll be underfull 
34120 61 66 74 65 72 20 74 68 65 20 6a 75 73 74 20 63  after the just c
34130 65 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ell .        ** 
34140 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 69 6e  copied to the in
34150 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64  ternal node is d
34160 65 6c 65 74 65 64 20 66 72 6f 6d 20 69 74 2e 20  eleted from it. 
34170 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61  This is a specia
34180 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  l.        ** cas
34190 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  e because the ca
341a0 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20  ll to balance() 
341b0 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20 69  to correct the i
341c0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20  nternal node.   
341d0 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e       ** may chan
341e0 67 65 20 74 68 65 20 74 72 65 65 20 73 74 72 75  ge the tree stru
341f0 63 74 75 72 65 20 61 6e 64 20 69 6e 76 61 6c 69  cture and invali
34200 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
34210 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
34220 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61  the leafCur.apPa
34230 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72  ge[] and leafCur
34240 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 2c  .aiIdx[] arrays,
34250 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 20   which will be. 
34260 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 62         ** used b
34270 79 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  y the balance() 
34280 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 72 72  required to corr
34290 65 63 74 20 74 68 65 20 75 6e 64 65 72 66 75 6c  ect the underful
342a0 6c 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a  l leaf.        *
342b0 2a 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  * node..        
342c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
342d0 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 69  e formula used i
342e0 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
342f0 20 61 62 6f 76 65 20 61 72 65 20 62 61 73 65 64   above are based
34300 20 6f 6e 20 66 61 63 65 74 73 20 6f 66 0a 20 20   on facets of.  
34310 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
34320 69 74 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20  ite file-format 
34330 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e  that do not chan
34340 67 65 20 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20  ge over time..  
34350 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34360 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
34370 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73  ->nFree==pBt->us
34380 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29  ableSize*2/3+1 )
34390 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
343a0 73 65 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e  se( pLeafPage->n
343b0 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70  Free+2+szNext==p
343c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
343d0 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  /3+1 );.        
343e0 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
343f0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 20  d = 1;.      }  
34400 20 20 20 20 20 20 0a 0a 20 20 20 20 20 20 69 66        ..      if
34410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34420 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
34430 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
34440 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
34450 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
34460 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
34470 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
34480 70 50 61 67 65 2c 20 69 64 78 29 2c 20 70 67 6e  pPage, idx), pgn
34490 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  oChild);.       
344a0 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
344b0 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
344c0 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63   0 );.        rc
344d0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
344e0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
344f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34500 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75 72  TE_OK && leafCur
34510 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20  sorInvalid ){.  
34520 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 61        /* The lea
34530 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e  f-node is now un
34540 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74  derfull and so t
34550 68 65 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f  he tree needs to
34560 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
34570 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65  rebalanced. Howe
34580 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63 65  ver, the balance
34590 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  () operation on 
345a0 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20  the internal.   
345b0 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f       ** node abo
345c0 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64 69  ve may have modi
345d0 66 69 65 64 20 74 68 65 20 73 74 72 75 63 74 75  fied the structu
345e0 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65  re of the B-Tree
345f0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
34600 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  so the current c
34610 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66 43  ontents of leafC
34620 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  ur.apPage[] and 
34630 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a  leafCur.aiIdx[].
34640 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e          ** may n
34650 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 20  ot be trusted.. 
34660 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34670 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    ** It is not p
34680 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79 20  ossible to copy 
34690 74 68 65 20 61 6e 63 65 73 74 72 79 20 66 72 6f  the ancestry fro
346a0 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65 20 73  m pCur, as the s
346b0 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ame.        ** b
346c0 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68 61  alance() call ha
346d0 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74 68  s invalidated th
346e0 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d  e pCur->apPage[]
346f0 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20 20   and aiIdx[].   
34700 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20       ** arrays. 
34710 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
34720 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20      ** The call 
34730 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  to saveCursorPos
34740 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e  ition() below in
34750 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20 74  ternally saves t
34760 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b  he .        ** k
34770 65 79 20 74 68 61 74 20 6c 65 61 66 43 75 72 20  ey that leafCur 
34780 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
34790 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e  nting to. Curren
347a0 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20 20  tly, there.     
347b0 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f     ** are two co
347c0 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65 79  pies of that key
347d0 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20 6f   in the tree - o
347e0 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  ne here on the l
347f0 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eaf.        ** p
34800 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73  age and one on s
34810 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ome internal nod
34820 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20 54  e in the tree. T
34830 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20  he copy on.     
34840 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e     ** the leaf n
34850 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 74 68  ode is always th
34860 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74 72  e next key in tr
34870 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20 74  ee-order after t
34880 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
34890 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  opy on the inter
348a0 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68  nal node. So, th
348b0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
348c0 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20 20  3BtreeNext().   
348d0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65       ** calls re
348e0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
348f0 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20 74  ion() to point t
34900 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
34910 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a 2a   copy.        **
34920 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 69   stored on the i
34930 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68  nternal node, th
34940 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20 74  en advances to t
34950 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20  he next entry,. 
34960 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20         ** which 
34970 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
34980 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65  e copy of the ke
34990 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  y on the interna
349a0 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20 20  l node..        
349b0 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20 6c  ** Net effect: l
349c0 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74 69  eafCur is pointi
349d0 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  ng back to the d
349e0 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20 20  uplicate cell.  
349f0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e 65        ** that ne
34a00 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eds to be remove
34a10 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66 43  d, and the leafC
34a20 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a  ur.apPage[] and.
34a30 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66 43          ** leafC
34a40 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61 79  ur.aiIdx[] array
34a50 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 20  s are correct.. 
34a60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34a70 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f    VVA_ONLY( Pgno
34a80 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61   leafPgno = pLea
34a90 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  fPage->pgno );. 
34aa0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
34ab0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26  CursorPosition(&
34ac0 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20 20  leafCur);.      
34ad0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
34af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
34b00 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c  eeNext(&leafCur,
34b10 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
34b20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c      }.        pL
34b30 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75  eafPage = leafCu
34b40 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72  r.apPage[leafCur
34b50 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 20  .iPage];.       
34b60 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
34b70 49 54 45 5f 4f 4b 20 7c 7c 20 70 4c 65 61 66 50  ITE_OK || pLeafP
34b80 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50  age->pgno==leafP
34b90 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 61  gno );.        a
34ba0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
34bb0 45 5f 4f 4b 20 7c 7c 20 6c 65 61 66 43 75 72 2e  E_OK || leafCur.
34bc0 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50  aiIdx[leafCur.iP
34bd0 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  age]==0 );.     
34be0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 53 51   }..      if( SQ
34bf0 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20  LITE_OK==rc.    
34c00 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d     && SQLITE_OK=
34c10 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
34c20 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50 61  gerWrite(pLeafPa
34c30 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20  ge->pDbPage)) . 
34c40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34c50 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50 61  dropCell(pLeafPa
34c60 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b 0a  ge, 0, szNext);.
34c70 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59          VVA_ONLY
34c80 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53  ( leafCur.pagesS
34c90 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20  huffled = 0 );. 
34ca0 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
34cb0 6e 63 65 28 26 6c 65 61 66 43 75 72 2c 20 30 29  nce(&leafCur, 0)
34cc0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
34cd0 28 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61  ( leafCursorInva
34ce0 6c 69 64 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e  lid || !leafCur.
34cf0 70 61 67 65 73 53 68 75 66 66 6c 65 64 0a 20 20  pagesShuffled.  
34d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d20 20 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67 65 73   || !pCur->pages
34d30 53 68 75 66 66 6c 65 64 20 29 3b 0a 20 20 20 20  Shuffled );.    
34d40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
34d50 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
34d60 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61  eTempCursor(&lea
34d70 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fCur);.  }else{.
34d80 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
34d90 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
34da0 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ete from leaf %d
34db0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72  \n",.       pCur
34dc0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
34dd0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72  e->pgno));.    r
34de0 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61  c = dropCell(pPa
34df0 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ge, idx, cellSiz
34e00 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
34e10 6c 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  l));.    if( rc=
34e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34e30 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
34e40 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
34e50 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
34e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34e70 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
34e80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
34e90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
34ea0 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20 74  te a new BTree t
34eb0 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e 74  able.  Write int
34ec0 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20 70  o *piTable the p
34ed0 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
34ee0 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
34ef0 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
34f00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65  ..**.** The type
34f10 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74 65   of type is dete
34f20 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66 6c  rmined by the fl
34f30 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20 20  ags parameter.  
34f40 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  Only the.** foll
34f50 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66 20  owing values of 
34f60 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65 6e  flags are curren
34f70 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74 68  tly in use.  Oth
34f80 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a  er values for.**
34f90 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f 74   flags might not
34fa0 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   work:.**.**    
34fb0 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54   BTREE_INTKEY|BT
34fc0 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20 20  REE_LEAFDATA    
34fd0 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74 61   Used for SQL ta
34fe0 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64 20  bles with rowid 
34ff0 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52 45  keys.**     BTRE
35000 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20 20  E_ZERODATA      
35010 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 64              Used
35020 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65 73   for SQL indices
35030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
35040 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
35050 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
35060 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
35070 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  s){.  BtShared *
35080 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
35090 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
350a0 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b    Pgno pgnoRoot;
350b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
350c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
350d0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
350e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
350f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
35100 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
35110 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
35120 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66  readOnly );..#if
35130 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35140 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20  AUTOVACUUM.  rc 
35150 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
35160 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c  age(pBt, &pRoot,
35170 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30   &pgnoRoot, 1, 0
35180 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
35190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
351a0 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42  }.#else.  if( pB
351b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
351c0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f  .    Pgno pgnoMo
351d0 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ve;      /* Move
351e0 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20   a page here to 
351f0 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
35200 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  e root-page */. 
35210 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
35220 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61  eMove; /* The pa
35230 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a  ge to move to. *
35240 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69  /..    /* Creati
35250 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d  ng a new table m
35260 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75  ay probably requ
35270 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78  ire moving an ex
35280 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a  isting database.
35290 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72      ** to make r
352a0 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20  oom for the new 
352b0 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65  tables root page
352c0 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20 70  . In case this p
352d0 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a  age turns.    **
352e0 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76   out to be an ov
352f0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c  erflow page, del
35300 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77  ete all overflow
35310 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73   page-map caches
35320 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20  .    ** held by 
35330 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20  open cursors..  
35340 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64    */.    invalid
35350 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
35360 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f  che(pBt);..    /
35370 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  * Read the value
35380 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d   of meta[3] from
35390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
353a0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65   determine where
353b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
353c0 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
353d0 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f   table should go
353e0 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65  . meta[3] is the
353f0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
35400 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  ge.    ** create
35410 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65  d so far, so the
35420 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69   new root-page i
35430 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20  s (meta[3]+1).. 
35440 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
35450 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
35460 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47  ta(p, BTREE_LARG
35470 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26  EST_ROOT_PAGE, &
35480 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
35490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
354a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
354b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
354c0 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20  gnoRoot++;..    
354d0 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d  /* The new root-
354e0 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
354f0 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70  allocated on a p
35500 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
35510 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50   or the.    ** P
35520 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65  ENDING_BYTE page
35530 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
35540 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54  le( pgnoRoot==PT
35550 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
35560 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20   pgnoRoot) ||.  
35570 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d        pgnoRoot==
35580 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35590 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
355a0 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20  pgnoRoot++;.    
355b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  }.    assert( pg
355c0 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20  noRoot>=3 );..  
355d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
355e0 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74  page. The page t
355f0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  hat currently re
35600 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f  sides at pgnoRoo
35610 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
35620 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c   moved to the al
35630 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e  located page (un
35640 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74  less the allocat
35650 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a  ed page happens.
35660 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65      ** to reside
35670 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20   at pgnoRoot).. 
35680 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61     */.    rc = a
35690 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
356a0 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65  (pBt, &pPageMove
356b0 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e  , &pgnoMove, pgn
356c0 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69  oRoot, 1);.    i
356d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
356e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
356f0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
35700 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67  if( pgnoMove!=pg
35710 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
35720 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  /* pgnoRoot is t
35730 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  he page that wil
35740 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
35750 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20  e root-page of. 
35760 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
35770 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20  table (assuming 
35780 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74  an error did not
35790 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20   occur). But we 
357a0 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  were.      ** al
357b0 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65  located pgnoMove
357c0 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69  . If required (i
357d0 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f  .e. if it was no
357e0 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  t allocated.    
357f0 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e    ** by extendin
35800 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65  g the file), the
35810 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74   current page at
35820 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f   position pgnoMo
35830 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  ve.      ** is a
35840 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64  lready journaled
35850 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35860 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
35870 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
35880 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
35890 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a  ge(pPageMove);..
358a0 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68        /* Move th
358b0 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
358c0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20   at pgnoRoot to 
358d0 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20  pgnoMove. */.   
358e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
358f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
35900 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
35910 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
35920 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35930 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
35940 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
35950 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
35960 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
35970 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
35980 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
35990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
359a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
359b0 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
359c0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
359d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
359e0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
359f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
35a00 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
35a10 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
35a20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
35a30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
35a40 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
35a50 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
35a60 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
35a70 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
35a80 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
35a90 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  pgnoMove, 0);.  
35aa0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35ab0 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
35ac0 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
35ad0 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
35ae0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
35af0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35b00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
35b20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
35b30 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
35b40 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
35b50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
35b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35b70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
35b90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
35ba0 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
35bb0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
35bc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35bd0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
35be0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
35bf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35c00 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35c10 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
35c20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
35c30 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
35c40 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
35c50 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
35c60 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
35c70 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
35c80 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
35c90 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
35ca0 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
35cb0 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
35cc0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
35cd0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
35ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35cf0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
35d00 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
35d10 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
35d20 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
35d30 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
35d40 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
35d50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35d60 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
35d70 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
35d80 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
35d90 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
35da0 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
35db0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
35dc0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
35dd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
35de0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
35df0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
35e00 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
35e10 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
35e20 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
35e30 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
35e40 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
35e50 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
35e60 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
35e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
35e80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
35e90 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
35ea0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
35eb0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
35ec0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
35ed0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
35ee0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65  .  rc = btreeCre
35ef0 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61  ateTable(p, piTa
35f00 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73  ble, flags);.  s
35f10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
35f20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
35f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
35f40 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
35f50 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  ase page and all
35f60 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20   its children.  
35f70 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61  Return.** the pa
35f80 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
35f90 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
35fa0 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  t clearDatabaseP
35fb0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
35fc0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
35fd0 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61  /* The BTree tha
35fe0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
35ff0 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  able */.  Pgno p
36000 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
36010 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
36020 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74  o clear */.  int
36030 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20 20   freePageFlag,  
36040 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
36050 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
36060 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65  .  int *pnChange
36070 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
36080 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
36090 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
360a0 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
360b0 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
360c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
360d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
360e0 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67  ;.  if( pgno>pag
360f0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
36100 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
36110 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
36120 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
36130 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
36140 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
36150 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
36160 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
36170 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
36180 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
36190 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
361a0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
361b0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
361c0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
361d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
361e0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
361f0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
36200 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  ell), 1, pnChang
36210 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
36220 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
36230 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
36240 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c     }.    rc = cl
36250 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
36260 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
36270 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
36280 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
36290 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
362a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
362b0 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
362c0 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
362d0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
362e0 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  [8]), 1, pnChang
362f0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
36300 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
36310 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
36320 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67  else if( pnChang
36330 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
36340 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
36350 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20  ;.    *pnChange 
36360 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b  += pPage->nCell;
36370 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
36380 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
36390 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
363a0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
363b0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
363c0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
363d0 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
363e0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
363f0 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
36400 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
36410 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
36420 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
36430 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
36440 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
36450 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
36460 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
36470 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
36480 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
36490 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
364a0 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
364b0 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
364c0 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
364d0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
364e0 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
364f0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
36500 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
36510 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
36520 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
36530 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
36540 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
36550 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
36560 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
36570 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
36580 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
36590 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
365a0 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
365b0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  able..**.** If p
365c0 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e  nChange is not N
365d0 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20  ULL, then table 
365e0 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61  iTable must be a
365f0 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20  n intkey table. 
36600 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76  The.** integer v
36610 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  alue pointed to 
36620 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69  by pnChange is i
36630 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
36640 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
36650 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61  ntries in the ta
36660 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
36670 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
36680 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
36690 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e   iTable, int *pn
366a0 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72  Change){.  int r
366b0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
366c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
366d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
366e0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
366f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
36700 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
36710 28 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65  (rc = checkForRe
36720 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
36730 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53  Table, 0, 1))!=S
36740 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36750 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
36760 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
36770 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
36780 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
36790 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
367a0 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
367b0 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
367c0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  lse{.    rc = cl
367d0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
367e0 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
367f0 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b  e, 0, pnChange);
36800 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
36810 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
36820 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36830 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66  ** Erase all inf
36840 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61  ormation in a ta
36850 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ble and add the 
36860 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
36870 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65  e to.** the free
36880 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74  list.  Except, t
36890 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70  he root of the p
368a0 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28  rinciple table (
368b0 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61  the one on.** pa
368c0 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61  ge 1) is never a
368d0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
368e0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
368f0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
36900 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
36910 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
36920 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63  re any open.** c
36930 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
36940 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  ble..**.** If AU
36950 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
36960 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  led and the page
36970 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f   at iTable is no
36980 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f  t the last.** ro
36990 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
369a0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
369b0 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  en the last root
369c0 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65   page .** in the
369d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
369e0 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65  s moved into the
369f0 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
36a00 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54  ccupied by.** iT
36a10 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61  able and that la
36a20 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  st slot formerly
36a30 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65   occupied by the
36a40 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a   last root page.
36a50 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
36a60 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74  he freelist inst
36a70 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20  ead of iTable.  
36a80 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c  In this say, all
36a90 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61  .** root pages a
36aa0 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62  re kept at the b
36ab0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
36ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
36ad0 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73  hich.** is neces
36ae0 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43  sary for AUTOVAC
36af0 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68  UUM to work righ
36b00 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  t.  *piMoved is 
36b10 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70  set to the .** p
36b20 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
36b30 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  used to be the l
36b40 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ast root page in
36b50 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
36b60 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49  .** the move.  I
36b70 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d  f no page gets m
36b80 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69  oved, *piMoved i
36b90 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54  s set to 0..** T
36ba0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
36bb0 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e  e is recorded in
36bc0 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65   meta[3] and the
36bd0 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74   value of.** met
36be0 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20  a[3] is updated 
36bf0 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  by this procedur
36c00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
36c10 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
36c20 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
36c30 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
36c40 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
36c50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
36c60 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
36c70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
36c80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36c90 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
36ca0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
36cb0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
36cc0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20  ANS_WRITE );..  
36cd0 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
36ce0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
36cf0 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
36d00 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
36d10 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
36d20 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
36d30 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
36d40 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
36d50 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
36d60 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
36d70 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
36d80 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
36d90 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
36da0 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
36db0 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
36dc0 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
36dd0 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
36de0 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
36df0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
36e00 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
36e10 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
36e20 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
36e30 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d  pCursor->pBtree-
36e40 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
36e50 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
36e60 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
36e70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
36e80 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
36e90 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
36ea0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
36eb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
36ec0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
36ed0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
36ee0 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
36ef0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
36f00 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
36f10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
36f20 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64  .  }..  *piMoved
36f30 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61   = 0;..  if( iTa
36f40 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20  ble>1 ){.#ifdef 
36f50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
36f60 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20  VACUUM.    rc = 
36f70 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
36f80 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
36f90 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20  (pPage);.#else. 
36fa0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
36fb0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
36fc0 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  Pgno maxRootPgno
36fd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
36fe0 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
36ff0 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53  (p, BTREE_LARGES
37000 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 6d 61  T_ROOT_PAGE, &ma
37010 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20  xRootPgno);.    
37020 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
37040 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
37050 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
37060 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
37070 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d       if( iTable=
37080 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a  =maxRootPgno ){.
37090 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
370a0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
370b0 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62  opped is the tab
370c0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  le with the larg
370d0 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
370e0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
370f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
37100 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61   put the root pa
37110 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ge on the free l
37120 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ist. .        */
37130 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72  .        rc = fr
37140 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
37150 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
37160 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
37170 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
371a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
371b0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
371c0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
371d0 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20  ropped does not 
371e0 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74  have the largest
371f0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
37200 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20     ** number in 
37210 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f  the database. So
37220 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74   move the page t
37230 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68  hat does into th
37240 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61  e .        ** ga
37250 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
37260 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e  leted root-page.
37270 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
37280 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f      MemPage *pMo
37290 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  ve;.        rele
372a0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
372b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
372c0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
372d0 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
372e0 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20  o, &pMove, 0);. 
372f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37310 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37330 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
37340 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c  Page(pBt, pMove,
37350 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
37360 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b  , 0, iTable, 0);
37370 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
37380 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
37390 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
373a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
373b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
373c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
373d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
373e0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
373f0 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
37400 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
37410 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37420 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
37430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37440 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
37450 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29   freePage(pMove)
37460 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
37470 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
37480 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
374a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
374b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
374c0 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78    *piMoved = max
374d0 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
374e0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
374f0 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f  the new 'max-roo
37500 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e  t-page' value in
37510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65   the database he
37520 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20  ader. This.     
37530 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76   ** is the old v
37540 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c  alue less one, l
37550 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20  ess one more if 
37560 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a  that happens to.
37570 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f        ** be a ro
37580 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20  ot-page number, 
37590 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69  less one again i
375a0 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 20  f that is the.  
375b0 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
375c0 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20  YTE_PAGE..      
375d0 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  */.      maxRoot
375e0 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66  Pgno--;.      if
375f0 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
37600 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
37610 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
37620 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
37630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37640 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50  ( maxRootPgno==P
37650 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
37660 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29  , maxRootPgno) )
37670 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
37680 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
37690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
376a0 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44  axRootPgno!=PEND
376b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
376c0 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  t) );..      rc 
376d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
376e0 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d  dateMeta(p, 4, m
376f0 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
37700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
37710 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
37720 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
37730 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
37740 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
37750 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  se{.    /* If sq
37760 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
37770 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f  ble was called o
37780 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20  n page 1. */.   
37790 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
377a0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
377b0 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65  LEAF );.    rele
377c0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
377d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
377e0 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33    .}.int sqlite3
377f0 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  BtreeDropTable(B
37800 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
37810 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
37820 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
37830 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
37840 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
37850 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69  eeDropTable(p, i
37860 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b  Table, piMoved);
37870 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
37880 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
37890 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
378a0 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
378b0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
378c0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
378d0 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
378e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
378f0 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
37900 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
37910 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
37920 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
37930 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
37940 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
37950 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
37960 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
37970 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
37980 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
37990 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
379a0 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
379b0 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
379c0 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
379d0 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
379e0 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
379f0 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
37a00 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
37a10 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
37a20 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
37a30 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
37a40 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
37a50 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
37a60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
37a70 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
37a80 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a  , int idx, u32 *
37a90 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65  pMeta){.  DbPage
37aa0 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20   *pDbPage = 0;. 
37ab0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
37ac0 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
37ad0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
37ae0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
37af0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
37b00 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20  ;..  /* Reading 
37b10 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75  a meta-data valu
37b20 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61  e requires a rea
37b30 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
37b40 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a   (and hence.  **
37b50 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
37b60 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61  er table. We gra
37b70 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61  b this lock rega
37b80 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
37b90 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  r or.  ** not th
37ba0 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  e SQLITE_ReadUnc
37bb0 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
37bc0 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20   set (the table 
37bd0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20  rooted at page. 
37be0 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64   ** 1 is treated
37bf0 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
37c00 73 65 20 62 79 20 71 75 65 72 79 53 68 61 72 65  se by queryShare
37c10 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
37c20 29 0a 20 20 2a 2a 20 61 6e 64 20 73 65 74 53 68  ).  ** and setSh
37c30 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
37c40 63 6b 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63  ck())..  */.  rc
37c50 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
37c60 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
37c70 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
37c80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37c90 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
37ca0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
37cb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37cc0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64   }..  assert( id
37cd0 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=0 && idx<=15 
37ce0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  );.  if( pBt->pP
37cf0 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  age1 ){.    /* T
37d00 68 65 20 62 2d 74 72 65 65 20 69 73 20 61 6c 72  he b-tree is alr
37d10 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 20 72  eady holding a r
37d20 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
37d30 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
37d40 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  se.    ** file. 
37d50 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
37d60 20 72 65 71 75 69 72 65 64 20 6d 65 74 61 2d 64   required meta-d
37d70 61 74 61 20 76 61 6c 75 65 20 63 61 6e 20 62 65  ata value can be
37d80 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 0a 20   read directly. 
37d90 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
37da0 61 67 65 20 64 61 74 61 20 6f 66 20 74 68 69 73  age data of this
37db0 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
37dc0 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73   is slightly fas
37dd0 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ter than.    ** 
37de0 72 65 71 75 65 73 74 69 6e 67 20 61 20 6e 65 77  requesting a new
37df0 20 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d 20   reference from 
37e00 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e  the pager layer.
37e10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 31 20  .    */.    pP1 
37e20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
37e30 20 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   *)pBt->pPage1->
37e40 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a  aData;.  }else{.
37e50 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74 72 65      /* The b-tre
37e60 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  e does not have 
37e70 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
37e80 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
37e90 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
37ea0 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20 66 72  ** Obtain one fr
37eb0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
37ec0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  er..    */.    r
37ed0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37ee0 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
37ef0 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   1, &pDbPage);. 
37f00 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37f10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
37f20 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
37f30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
37f40 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67      pP1 = (unsig
37f50 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74  ned char *)sqlit
37f60 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
37f70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 2a  DbPage);.  }.  *
37f80 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65  pMeta = get4byte
37f90 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
37fa0 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ]);..  /* If the
37fb0 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 74 20 68   b-tree is not h
37fc0 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
37fd0 63 65 20 74 6f 20 70 61 67 65 20 31 2c 20 74 68  ce to page 1, th
37fe0 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20 2a 2a  en one was .  **
37ff0 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
38000 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
38010 69 6e 20 74 68 65 20 61 62 6f 76 65 20 62 6c 6f  in the above blo
38020 63 6b 2e 20 52 65 6c 65 61 73 65 20 69 74 20 6e  ck. Release it n
38030 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
38040 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20  pBt->pPage1 ){. 
38050 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
38060 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
38070 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f   }..  /* If auto
38080 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61  vacuumed is disa
38090 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
380a0 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72  ld but we are tr
380b0 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63  ying to .  ** ac
380c0 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75  cess an autovacu
380d0 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  umed database, t
380e0 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74  hen make the dat
380f0 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20  abase readonly. 
38100 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
38110 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
38120 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 42  UUM.  if( idx==B
38130 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f  TREE_LARGEST_ROO
38140 54 5f 50 41 47 45 20 26 26 20 2a 70 4d 65 74 61  T_PAGE && *pMeta
38150 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e  >0 ) pBt->readOn
38160 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  ly = 1;.#endif..
38170 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
38180 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 6f 70   currently an op
38190 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
381a0 67 72 61 62 20 61 20 72 65 61 64 2d 6c 6f 63 6b  grab a read-lock
381b0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
381c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
381d0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
381e0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
381f0 20 74 68 61 74 0a 20 20 2a 2a 20 6e 6f 20 6f 74   that.  ** no ot
38200 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  her connection c
38210 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6d 65  an modify the me
38220 74 61 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  ta value just re
38230 61 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  ad from.  ** the
38240 20 64 61 74 61 62 61 73 65 20 75 6e 74 69 6c 20   database until 
38250 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
38260 69 73 20 63 6f 6e 63 6c 75 64 65 64 2e 0a 20 20  is concluded..  
38270 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
38280 61 6e 73 3e 30 20 29 7b 0a 20 20 20 20 72 63 20  ans>0 ){.    rc 
38290 3d 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  = setSharedCache
382a0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20  TableLock(p, 1, 
382b0 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a  READ_LOCK);.  }.
382c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
382d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
382e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
382f0 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  ite meta-informa
38300 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tion back into t
38310 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
38320 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64  ta[0] is.** read
38330 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f  -only and may no
38340 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  t be written..*/
38350 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
38360 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65  eUpdateMeta(Btre
38370 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
38380 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53  32 iMeta){.  BtS
38390 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
383a0 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
383b0 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74  char *pP1;.  int
383c0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
383d0 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35  dx>=1 && idx<=15
383e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
383f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
38400 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
38410 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
38420 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
38430 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70  pPage1!=0 );.  p
38440 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
38450 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
38460 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
38470 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e